7

我有我的域分割成多個實體框架模型。我有一些跨越多個模型(名爲Lookup)的共享實體,但是,這些替換爲使用Working With Large Models In Entity Framework中描述的方法的「使用」引用。然而,讓我的案例更獨特的是我也將這些模型分成多個數據庫(每個模型一個)。實體框架 - 插入實體與多個模型和數據庫

我在將一個共享實體插入我的公共數據庫時遇到問題。它的失敗與錯誤:

The member with identity 'Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup' does not exist in the metadata collection.

外鍵,它的指不在「共同DB」的存在。但我也是而不是與關係另一側的實體(名爲ResidentialAddress)一起工作;我甚至沒有包含其他實體初始化的上下文(命名爲MembersDb)。但是,兩種模型都編譯成相同的程序集。

有沒有導航性能查找到ResidentialAddress。雖然有另一個方向的導航屬性(我不會堅持 - 只能在內存中使用)。

對於CommonDb上下文中的EntityConnection,我的MetadataWorkspace僅針對該數據庫所需的數據使用SSDL/CSDL/MSL進行了顯式初始化。我已經確認沒有對該組架構數據中提到的外鍵的引用。

var metaAssembly = typeof(CommonDb).Assembly; 
var schemaResources = new string[] 
{ 
    String.Format("res://{0}/Common.ssdl", metaAssembly.FullName), 
    String.Format("res://{0}/Common.csdl", metaAssembly.FullName), 
    String.Format("res://{0}/Common.mdl", metaAssembly.FullName), 
} 
MetadataWorkspace metadata = new MetadataWorkspace(schemaResources, new []{ metaAssembly }); 
EntityConnection connection = new EntityConnection(metadata, myDatabaseConnection); 

可能的線索:它的工作,當我進入生成的類並刪除所有EdmRelationshipAttribute屬性沿其配對從相關模型(MembersDb)EdmRelationshipNavigationPropertyAttribute

關鍵問題:

  1. 那麼,爲什麼這個實體框架是試圖做一些與該是既不在範圍和更不會被插入而受到影響的實體之間的關係的記錄!?

  2. 我很高興有生成的代碼刪除上面提到的屬性,但我仍然希望導航屬性保留。我將如何改變CSDL來實現這一目標?

注意:「子」模型的持久性不是優先級,也不是他們現在跨DB數據庫外鍵的完整性。這些數據庫使用SQL CE持久化,但它們最初是從單個主SQL Server數據庫生成的。

回答

7

如果模型的每個部分都寫入單獨的數據庫,那麼edmx文件可能不應該彼此瞭解(關於實體或與不屬於它們的實體的關係)。

如何嘗試以下方法之一:
(最終爲每個部件使用相同的實體類,但使EF忽略它們之間的連接。)

  1. 刪除edmx +中的「usings」取消自動生成並自己創建類。
  2. 刪除edmx + modify t4模板中的「usings」以在創建類時讀取多個edmx。
  3. 將edmx文件放在一邊,因此您有兩套edmxs。
    3.a.使用設置#1自動生成實體。
    3.b.通過刪除「使用」來修改組#2,並用於生成存儲庫類(對象集)。

讓我知道這些作品之一。你好, 丹尼。

+1

Danny,我最終選擇了類似於選項2的東西。我構建了一個生成器(使用EdmGen2作爲啓動器),允許刪除屬性。我花了一些額外的努力來手動生成(我寫了CodeDom)我第一次從CSDL中移除的導航屬性。 – Reddog 2011-04-11 23:07:36