【问题标题】:Entity Framework - Inserting entity with multiple models and databases实体框架 - 插入具有多个模型和数据库的实体
【发布时间】:2011-07-30 07:43:04
【问题描述】:

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

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

有身份的成员 'Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup' 元数据中不存在 收藏。

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

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

我的 MetadataWorkspace 用于 CommonDb 上下文的 EntityConnection 已显式初始化,只有 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. 那么,为什么 Entity Framework 试图对既不在范围内也不会受到插入记录影响的实体的关系做一些事情!?

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

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

【问题讨论】:

    标签: c# .net entity-framework ado.net-entity-data-model entityreference


    【解决方案1】:

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

    尝试以下方法之一怎么样:
    (最终为每个部分提供相同的实体类,但让 EF 忽略它们之间的连接。)

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

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

    祝你好运, 丹尼。

    【讨论】:

    • Danny,我最终选择了类似于选项 2 的东西。我构建了一个允许删除属性的生成器(使用 EdmGen2 作为启动器)。我付出了一些额外的努力来手动生成(我编写了 CodeDom)我首先从 CSDL 中删除的导航属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2012-02-08
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多