【问题标题】:Entity Framework 4 and persisting foreign key relationships实体框架 4 和持久的外键关系
【发布时间】:2010-05-18 12:19:23
【问题描述】:

我几乎是 Entity Framework(特别是第 4 版)的新手,我正在尝试了解我遇到的问题。

我有一个与 Entity Framework 4 和一个 Repository 类一起使用的 ASP.NET MVC2 项目。我已经定义了一个简单的外键关系。当我运行我的 MVC 项目时,我可以通过在我的实体上设置外键 ID 来加载 MVC 表单并更新外键关系。我通过在部分类中调用 OnPropertyIDChanging 并像这样设置 EntityKey 来做到这一点

this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value);

我创建了第二个项目,它是一个命令行项目,用于加载模型的初始数据。但是,当我调用 Repository 对象以添加实体时,我得到一个无法将 Null 值插入子实体表(制造商)。如果我在父对象(产品)上显式设置对子对象(制造商)的引用,调用我的存储库以获取制造商对象并设置产品的制造商对象,我会得到一个异常声明

无法引用实体对象 通过多个实例 IEntityChangeTracker

我假设这是因为在我的每个存储库对象上都有一个对实体上下文的全局引用,因此我有一个制造商和产品的开放上下文。

在进行一些研究时,我发现通过从查询中加载对象,对象关系是通过 RelationshipEntry 对象显式创建的。当我在命令行应用程序中创建对象时,不会发生这种情况。解决这个问题的方法是什么?我假设如果我尝试创建 Web 服务,我会遇到同样的问题,因为我是在没有先调用 SQL 的情况下创建对象的。

其次,是否有管理上下文的最佳实践?是在每个存储库方法中创建和处理上下文、每个存储库对象中的全局引用还是传递给每个存储库构造函数的上下文更好?

谢谢!

约翰

【问题讨论】:

    标签: .net entity-framework .net-4.0 entity-relationship entity-framework-4


    【解决方案1】:

    其次,是否有管理上下文的最佳实践?是在每个存储库方法中创建和处理上下文、每个存储库对象中的全局引用还是传递给每个存储库构造函数的上下文更好?

    其实,这是一个重要的问题。解决这个问题,另一个应该会消失。

    上下文应该是一个工作单元。因此,对于您的网络应用程序,这将是一个请求。每个工作单元应该只有一个上下文。使用 DI 在参与该工作单元的所有代码之间共享它,可能通过您的存储库。

    对于您的命令行应用,确定工作单​​元是什么。

    这条消息:

    一个实体对象不能被多个 IEntityChangeTracker 实例引用

    ...只是意味着,“你不能关联属于不同上下文的两个实体。这里的真正问题是同时存在两个不同的上下文。这并非不可能,但我认为要正确处理很棘手这是一种“仅限专家”的技术。

    这个黑客:

    this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value);
    

    ...在 EF 4 中不再需要。在 EF 4 中,您可以使用 FK 关联生成模型,然后执行以下操作:

    this.ManufacturerId = value;
    

    【讨论】:

    • 也许我的外键设置有问题。我决定尝试实现 Model First 方法并以这种方式设置外键(而不是通过数据库)。但是,如果我没有设置 EntityKey,那么我会得到子关系的插入空错误。这可能是上下文管理方式的另一个症状。
    • This post 解释了如何首先与模型建立 FK 关联。
    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2018-09-09
    • 2018-07-04
    相关资源
    最近更新 更多