2011-07-13 27 views
3

我打算在下一個項目中使用Entity Framework 4.1,但我很難找到一個好方法來解決它。 總之,我想建立一個多層應用程序,其中的實體將通過Web服務旅行,並儘可能保持乾淨,我想使用POCO而不是自我跟蹤實體。此外,已經存在一個SQL 2008數據庫,將用於將這些實體作爲基礎。將.edmx加載到DbModelBuilder中

從我至今讀(朱莉·勒曼的文章http://msdn.microsoft.com/nl-nl/magazine/hh148150%28en-us%29.aspx,除其他外),似乎是:

  • 如果使用數據庫第一種方式,你會得到一個漂亮的.edmx編輯你的模型,但你總是會得到持久感知對象而不是POCO,這在我的情況下是沒有用的。
  • 如果使用Code First方法,「ADO.NET DbContext生成器」只能部分幫助您:它確實從.edmx生成實體,但它不會生成獲取外鍵和基數所需的代碼。這意味着代碼不能正常工作( - 編輯,不正確,請參閱我的文章下面),您必須
    • a)在您的POCO上使用數據註釋,這是醜陋的imo,因爲它污染了POCO的數據庫信息,並且還創建了對EntityFramework程序集的依賴。
    • b)使用傳遞給DbContext.OnModelCreating的DbModelBuilder來設置正確的外鍵,映射等信息(即'流利的'API)。即使API可能'流利',但仍然很難(並且可能無法維護)正確設置所有這些信息,以便它與現有數據庫相匹配(有關這方面的一些示例,請參閱http://sessionfactory.blogspot.com/2011/04/conventions-in-entity-framework-41.html)。

我知道爲什麼「DbModelBuilder路」需要這麼多努力的原因是因爲它的目的是要在其他方式使用:你應該來從實體定義數據庫,不要試圖調整所有實體,以便它們(希望)匹配已經存在的數據庫。然而,在我看來,「DbModelBuilder-way」最終會產生最好的結果:純粹的POCO沒有數據庫元數據。現在

,說了這麼多,我的問題是:
有誰知道的方式到的.edmx裝入DbModelBuilder,使外鍵,列映射等信息好好嘗試一下需要通過流暢的API手動指定?

我認爲這將是兩全其美的,因爲您可以像在Database First場景中那樣直觀地編輯映射,並且仍然獲得乾淨的POCO,因爲所有必需的元數據都存儲在DbModelBuilder中。

回答

1

顯然,有兩種方式可以從「ADO.NET的DbContext生成器」使用生成的代碼,這取決於哪種類型的使用連接字符串。

如果使用實體連接字符串,即:

<connectionStrings> 
    <add name="MyDBEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

DbContext將被填充來自.edmx的所有元數據(列映射,外鍵關係等)。此外,DbContext的OnModelCreating不會執行。這是Database First使用POCO的,這就是我想要實現的。

我做錯了什麼是我用一個常規的SQL連接字符串傳遞到DbContext。這會導致完全不同的行爲類型:因爲DbContext現在是空的,它將嘗試探索所有實體類並使用約定爲此生成數據庫模式。現在調用OnModelCreating,期待你調整這個映射,然後從中產生一個數據庫。

簡而言之,解決方案是使用實體連接字符串而不是SQL連接字符串。

0

閱讀有關T4 POCO生成模板:

那些T4代碼生成模板允許您使用

  • 數據庫,先用EDMX模型文件的方法
  • 但是:生成簡單的POCO(普通老式CLR對象),其中有沒有繼承任何EF特定的類 - 他們只是普通的絕對CLR類.....

這給你兩全其美 - 一個漂亮的EDMX模型持久性的無知POCO類。

+0

感謝您的鏈接,我一定會看看他們。 – Astrotrain

1

男人你在說什麼?

如果使用數據庫第一種方式,你會得到一個漂亮的.edmx到 編輯在模型中,但你總是最後持久感知 對象,而不是POCO的,這是沒有用的,我情況。

這是不正確的。 EDMX幾乎可以產生所有代碼,甚至許多代碼最先不能的東西。

如果使用代碼優先的方法,將「ADO.NET的DbContext發電機」 只有部分可以幫助你:它產生從的.edmx, 實體,但它不會產生獲得所需要的代碼外鍵和 基數正確。這意味着該代碼將不起作用 開箱即用,...

這是不正確的。一旦你正確設置了EDMX,它就會創建你想要的實體。

有誰知道的方式到的.edmx裝入DbModelBuilder

這樣,是的DbContext T4發電機!

無論如何還有一個工具可以檢查:EF Power Tools CTP1。這個工具可以從現有的數據庫創建代碼第一個映射

當然,每個工具都會創建1:1映射到數據庫的模型。如果你想要更多,你必須手動修改模型或映射!

+0

感謝您的回答,並很高興聽到我錯了。 – Astrotrain

+0

你說EDMX幾乎可以產生任何東西,但據我瞭解,EDMX編輯器只有2種代碼生成策略:默認和無 - 對我的知識,默認只生成持久感知實體?另外,你說「這種方式是DbContext T4生成器」,但我只能得到現有表的普通C#等價物,而我的DbContext似乎並不知道或理解數據庫所具有的外鍵關係 - 我是做錯了什麼? – Astrotrain

+0

是的,你錯了。你應該真的通過一些教程。 DbContext T4 Generator將創建EDMX中定義的內容,但您可以更改該定義(並非總是您想要的,但這是EF中的全侷限制) - 正如我寫的,您始終以1:1映射開始。還有POCO生成器,它類似於DbContext生成器,但它使用ObjectContext API來代替。關係由導航屬性表示。您可以在導入嚮導中打開外鍵生成。但是你不想要持久性無知的對象嗎?外鍵如何屬於對象世界? –