2011-05-09 145 views
2

由於我已經有我的LINQ to SQL數據訪問解決方案的類,如果我想將它們遷移到EFCF,可能遇到什麼麻煩?由於數據庫已經存在,我不願意先調用這些代碼。要清楚的是,該應用程序尚未投入生產,因此如果EFCF清除數據,這並不是真正的損失。從LINQ到SQL到實體框架的遷移「代碼優先」

我可以參加一個如下的課程,只是在EFCF中使用它?我應該還是必須刪除數據註記屬性?

什麼需要改變,我有EntityRef和EntitySet?

[Table] 
public class PlanMember { 
    private EntityRef<SystemUser> _caseManager; 
    private EntityRef<PlanMemberStatus> _status; 

    public PlanMember() { 
     this.PlanMemberView = new Views.PlanMember(); 
    } 

    [Column(
     IsPrimaryKey = true, 
     IsDbGenerated = true, 
     AutoSync = AutoSync.OnInsert 
    )] 
    public Int64 ID { get; set; } 

    [Column] 
    public DateTime? BirthDate { get; set; } 

    [Column] 
    public String City { get; set; } 

    [Column] 
    public String FirstName { get; set; } 

    [Association(ThisKey = "CaseManagerID", Storage = "_caseManager")] 
    public SystemUser CaseManager { 
     get { return (this._caseManager.Entity); } 
     set { this._caseManager.Entity = value; } 
    } 

    [Column] 
    public String CaseManagerID { get; set; } 

    [Column] 
    public Boolean IsActive { get; set; } 

    public Boolean IsEligible { 
     get { return (this.PlanMemberView.IsEligible); } 
    } 

    [Column] 
    public String LastName { get; set; } 

    [Column] 
    public String MedicalRecord { get; set; } 

    [Column] 
    public String MemberNumber { get; set; } 

    [Column(Name = "PCPFullName")] 
    public String PrimaryCarePhysicianFullName { get; set; } 

    [Association(OtherKey = "PlanMemberID")] 
    public Views.PlanMember PlanMemberView { get; set; } 

    [Column] 
    public Int32 PostalCode { get; set; } 

    [Column] 
    public String Sex { get; set; } 

    [Column] 
    public String State { get; set; } 

    [Association(ThisKey = "StatusID", Storage = "_status")] 
    public PlanMemberStatus Status { 
     get { return (this._status.Entity); } 
     set { this._status.Entity = value; } 
    } 

    [Column] 
    public Int32 StatusID { get; set; } 
} 

回答

4

我們遷移從LINQ的應用程序的SQL EF POCO一代,但首先因爲它是當時沒有出爐還沒有嘗試過的代碼。真的不是很難。在我們的案例中,主要的難點在於以下不同:

  • Linq to Sql使用單獨的「橋」對象處理多對多關係,EF將這些關係視爲各種排序的集合。這改變了很多語義,並且可能導致很多代碼改變,特別是如果讓實體進入UI。
  • 另一個痛點是可以爲空和不可空的關係。 Linq to Sql在這裏有點寬容,但是爲了讓EF發揮出色,我們需要允許可空列(Nullable Column),這是我們傳統上沒有的地方。
  • Linq to Sql和EF數據映射有時對映射到的CLR類型有不同的想法。 Xml專欄是我們的主要難點,但您可能沒有任何這些。
  • 大招/噩夢是如何讓沒有打破一切可怕的LINQ to SQL中生成的實體,擺脫L2S位。

這不是我想嘗試沒有一套非常有效的單元測試,給你一個自動化的基礎,給你非常常規的溫度讀數。我們的另一個天賜之物是我們有一個非常穩定的Repository模式實現 - 沒有什麼是直接與EF/Linq2Sql位對話的,而是兩個實現IRepository的類。基本上,這是一個很好的測試,你是如何嚴格執行你的架構。此外,這是一個當你意識到resharper值得每一分錢的場合。

要回答你一個直接的問題,我不認爲屬性必然重要,但我會刪除它們,以免有任何潛在的混亂和/或命名空間衝突。

+0

幸運的是,這個應用程序相對簡單,並且不包含許多M:N關係。你能否詳細說明爲什麼你必須允許EF可以使用空列來很好地播放?沒有XML類型,至少不在LOB區域。我也在使用存儲庫,希望在發佈之前用WCF包裝它。還爲ReSharper +1! – Yuck 2011-05-09 15:23:11

+0

可能是我前面的錯誤 - 從過去的宿醉,但我們避免int?值,所以我們設置了一些「可空」關係作爲「foregin key ID或-1爲null」,但根本不能用EF工作,它期望FK列可以爲空。 – 2011-05-09 15:37:07

1

假設你的類的名稱相同,數據庫中的表,和你的類的屬性相匹配的數據庫列名,你應該能夠刪除所有的屬性,並使用這些相同的類作爲您的EF代碼優先模式(我不認爲你必須刪除的屬性,但除非你打算繼續在LINQ2SQL模型中使用它們,沒有理由讓他們,因爲有些事情會在遷移可能會改變,它很可能是最好刪除他們因爲你的新實體可能還不能在Linq2Sql中工作)。如果你的類不符合你的數據庫模式,Scott Guthrie has a blog post about Entity Framework 4 "Code-First": Custom Database Schema Mapping

什麼需要改變,我有EntityRef和EntitySet?

定義爲EntityRef<OtherEntity>一個關係可以用一個屬性來代替只需鍵入OtherEntityEntitySet<OtherEntity>可以成爲ICollection<OtherEntity>或任何實現ICollection<T>IDbSet<OtherEntity>(我相信DbSet<T>是你會得到什麼,如果你正在從現有數據庫中生成模型)。

+0

謝謝,這是關於協會的好信息。在EF中似乎很簡單。 – Yuck 2011-05-09 15:45:36

相關問題