我是Entity Framework(特别是第4版)的新手,我正在努力了解我遇到的问题。
我有一个ASP.NET MVC2项目,我正在使用Entity Framework 4和Repository类。我有一个简单的外键关系,我已经定义了。当我运行我的MVC项目时,我能够加载MVC表单并通过在我的实体上设置外键ID来更新外键关系。我通过调用部分类中的OnPropertyIDChanging并设置EntityKey来实现这一点
this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value);
我创建了第二个项目,这是一个命令行项目,用于加载模型的初始数据。但是,当我调用Repository对象添加实体时,我得到一个无法将Null值插入子实体表(Manufacturer)。如果我明确地将父对象(Product)的引用设置为子对象(Manufacturer),调用我的存储库以获取制造商对象并设置产品的制造商对象,我会得到一个异常陈述
无法引用实体对象 通过多个实例 IEntityChangeTracker
我认为这是对每个存储库对象上的Entity上下文进行全局引用的结果,因此我有一个制造商和产品的开放上下文。
在做一些研究时,我已经看到通过从查询加载对象,通过RelationshipEntry对象显式创建对象关系。当我在命令行应用程序中创建对象时,这不会发生。有什么方法可以解决这个问题?我假设如果我尝试创建Web服务,我会遇到同样的问题,因为我在创建对象时没有先调用SQL。
其次,管理上下文是否有最佳实践?是否更好地在每个存储库方法中创建和处理上下文,每个存储库对象中的全局引用或传递给每个存储库构造函数的上下文?
谢谢!
约翰
答案 0 :(得分:3)
其次,管理上下文是否有最佳实践?是否更好地在每个存储库方法中创建和处理上下文,每个存储库对象中的全局引用或传递给每个存储库构造函数的上下文?
实际上,这是一个重要的问题。解决这个问题,另一个应该消失。
背景应该是一个工作单元。因此,对于您的Web应用程序,这将是一个请求。每个工作单元应该只有一个上下文。使用DI在参与该工作单元的所有代码中共享它,可能通过您的存储库。
对于您的命令行应用,请确定工作单元是什么。
此消息:
IEntityChangeTracker的多个实例
无法引用实体对象
...只是意味着,“你不能把两个属于不同情境的实体联系起来。这里真正的问题是两个不同的情境同时存在。这不是不可能的,但是我觉得很难做到它是一种“仅限专家”的技术。
这个黑客:
this.ManufacturerReference.EntityKey = new System.Data.EntityKey("MachinesEntities.Manufacturers", "ManufacturerId", value);
...在EF 4中不再需要了。在EF 4中,您可以使用FK关联生成模型,然后执行:
this.ManufacturerId = value;