Entity Framework使用心得

来源:互联网 发布:上海知杰公关策划 编辑:程序博客网 时间:2024/05/16 08:38

首先最给力的教程附上:www.entityframeworktutorial.net

其实照着教程一步一步来的。

首先建立Email类。然后再该类最下面写一个相应的Context类,并且一开始我就用的 :base("数据库名字")。然后就可以直接运行了。其实数据库会新建到默认的connectionString里。那么默认的connectionString在哪里呢?其实并不在我的类库project的app.config当中,而是在我的启动project的app.config当中。

  <entityFramework>    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">      <parameters>        <parameter value="mssqllocaldb" />      </parameters>    </defaultConnectionFactory>    <providers>      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />    </providers>  </entityFramework>

所以其实就是 (localdb)\mssqllocaldb的数据库中。但是有很多人说在 (localdb)\v11.0或者在 (localdb)\sqlexpress中,这都是有可能的,如果他安装了Express的话。

还有一种方法可以知道到底存到哪里去了,那就是查看本地的实例有哪些。


巨坑爹的是x64的程序会有问题,查了一下,确实有问题=_=||,详见:http://entityframework.codeplex.com/workitem/2273

所以就把所有x64的程序在解决方案的属性设置里build的勾勾都去掉了。


然后成功了。数据库里有数据了。


但是到了公司电脑上就完蛋了。原因是我当时不太会migration,总是依赖于开启自动迁移。但是自动迁移他不work!!!

不过后来学会了怎么迁移。其实也弱智的。

首先我在consoleTest的工程(启动工程)的App.config当中设置好我的connectionString,然后把DBContext继承的基类的构造函数里的参数改成了:base("name=xxxxconnectionString")要和config当中的一致。
下面注释掉的是我以前的,没注释的是改过了的,此时localhost存在,而数据库EnronKB不存在,当然存在不存在影响不大,迁移的时候ef会判断。

  <connectionStrings>    <!--add name="EnronKBConnectionString" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=EnronKB;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/-->    <add name="EnronKBConnectionString" connectionString="Data Source=localhost;Initial Catalog=EnronKB;Persist Security Info=True;User ID=sa;Password=hello1234!" providerName="System.Data.SqlClient"/>  </connectionStrings>

改完了之后,我最经常干的一件事就是打开package manager console然后输入

 Add-Migration Init回车

然后start工程,一切搞定,下次如果有更改我一般都直接到数据库中删除掉所有新建的表,然后再回到package manager console然后输入Add-Migration Init回车这一步。(貌似有好方法我还尝试,要组会啦,能交差就行了)

最后呢,当数据库一切定型了,我就可以turn off initializer了,不然每次启动工程都要好久好久。


其中还用到了一些小技术,这都在最开头的教程中又说。不看不知道一看吓一跳。比如自动键值。


另外,非常坑爹的一点,用了ef,数据库已经填了很多,编译会异常漫长。

解决办法是:新建临时数据库Temp,将connectionString指向Temp,就好了。(猜测EF会在项目编译时把数据库扫一遍)


最后我的类附上:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Forest.CMU{using System.Data.Entity;    using System.ComponentModel.DataAnnotations;    public class Email    {        public Email()        {            EmailID =-1;            Message_ID ="";.....................        }        [Key]        public int EmailID { get; set; }        public string Message_ID { get; set; }..............................    }    public class EnronKBContext : DbContext    {        public EnronKBContext()            //: base("EnronKB")            : base("name=EnronKBConnectionString")        {        }        public DbSet<Email> Emails { get; set; }    }}




0 0
原创粉丝点击