我将我的域拆分为多个Entity Framework模型。我有一些跨多个模型的共享实体(名为Lookup),但是,使用Working With Large Models In Entity Framework中描述的方法将这些实体替换为“using”引用。然而,让我的案例稍微独特的是,我还将这些模型分成多个数据库(每个模型一个)。
我在将一个共享实体插入公共数据库时遇到问题。它失败了错误:
具有身份的成员 'Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup' 元数据中不存在 集合。
它所指的外键在“common DB”上存在 not 。但我也不与关系另一端的实体(名为ResidentialAddress)合作;我甚至没有包含初始化的其他实体的上下文(名为MembersDb)。但是,两个模型都编译到同一个程序集中。
从 Lookup到ResidentialAddress没有导航属性。虽然在另一个方向有一个导航属性(我不会坚持 - 只在内存中使用)。
CommonDb上下文的MetadataWorkspace
的{{1}}已明确初始化,只有SSDL / CSDL / MSL用于该数据库所需的数据。我已经确认没有对该组架构数据中提到的外键的引用。
EntityConnection
可能的CLUE:当我进入生成的类并从相关模型(MembersDb)中删除所有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
时,它确实有效
关键问题:
那么为什么实体框架试图对一个既不在范围内也不会受到插入记录影响的实体的关系做某事呢?
< / LI>我很高兴让生成的代码删除上面提到的属性,但我仍然希望保留导航属性。我将如何改变CSDL以实现这一目标?
注意:“子”模型的持久性不是优先级,也不是它们现在的跨数据库外键的完整性。这些数据库使用SQL CE保留,但它们最初是从单个主SQL Server数据库生成的。
答案 0 :(得分:7)
如果模型的每个部分都写入单独的数据库,那么edmx文件可能不应该彼此了解(关于实体或与不属于它们的实体的关系)。
如何尝试以下方法之一:
(最终为每个部分使用相同的实体类,但使EF忘记它们之间的连接。)
如果其中一项有效,请告诉我。
祝你好运, 丹尼。