7

我将我的域拆分为多个实体框架模型。我有一些跨越多个模型的共享实体(名为 Lookup),但是,这些实体被使用在实体框架中处理大型模型中描述的方法替换为“使用”引用。但是,使我的案例更加独特的是,我还将这些模型分成多个数据库(每个模型一个)。

我在将我的一个共享实体插入我的公共数据库时遇到问题。它因错误而失败:

元数据集合中不存在身份为“Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup”的成员。

它所指的外键在“公共数据库”上不存在。但我也没有与关系另一端的实体(名为 ResidentialAddress)合作;我什至没有包含已初始化的其他实体(名为 MembersDb)的上下文。但是,两个模型都编译到同一个程序集中。

没有Lookup 到 ResidentialAddress 的导航属性。虽然在另一个方向有一个导航属性(我不会坚持 - 只在内存中使用)。

MetadataWorkspaceCommonDb 上下文的MyEntityConnection仅使用 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);

可能的线索:当我进入生成的类并从相关模型(MembersDb)中删除所有EdmRelationshipAttribute属性及其配对时,它确实有效。EdmRelationshipNavigationPropertyAttribute

关键问题:

  1. 那么,为什么实体框架试图对既不在范围内也不会受到插入记录影响的实体的关系做一些事情!?

  2. 我很高兴生成的代码删除了上面提到的属性,但我仍然希望保留导航属性。我将如何改变 CSDL 以实现这一目标?

注意:“子”模型的持久性不是优先事项,它们现在跨数据库外键的完整性也不是优先事项。这些数据库使用 SQL CE 进行持久化,但它们最初是从单个主 SQL Server 数据库生成的。

4

1 回答 1

7

如果模型的每个部分都写入单独的数据库,那么 edmx 文件可能不应该相互了解(关于实体或与不属于它们的实体的关系)。

如何尝试以下方法之一:(
最终为每个部分使用相同的实体类,但让 EF 忘记它们之间的连接。)

  1. 从 edmx 中删除“使用”+取消自动生成并自己创建类。
  2. 从 edmx 中删除“usings” + 修改 t4 模板以在创建类时读取多个 edmx。
  3. 将 edmx 文件复制到一边,这样您就有了两组 edmx。
    3.a. 使用 set #1 自动生成实体。
    3.b。通过删除“usings”来修改 set #2 并用于生成存储库类(对象集)。

让我知道其中一项是否有效。

祝你好运,丹尼。

于 2011-04-08T17:29:28.437 回答