首先最给力的教程附上: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; }
}
}