Entity Framework使用心得

jodies發表於2014-12-29

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




相關文章