实体框架4让我发疯,这种情况是:
员工实体 - 多对多关联 - 部门实体
我从DepartmentRepository获取EmployeeRepository和Departments的员工。每个存储库使用自己的数据上下文。我的UI有一个部门列表(来自DepartmentRepository),以便为员工选择。
当为Employee选择一个Department时,它会从DepartmentRepository数据上下文中绑定一个Department,所以当我尝试保存一个Employee时,它会有一个很好的例外。
我需要将Departments的数据上下文与Employees的数据上下文分开,因为可以修改Departments并在DepartmentRepository上调用save更改也不能保存Employee。
单独的数据上下文适用于我的多个0或1关联,因为我只能绑定外键属性而不是实体实例。
我能想到的唯一解决方法是通过创建另一个与EmployeeRepository具有相同数据上下文的DepartmentRepository来修复关联中的集合,并使用EmployeeRepository datacontext从DepartmentRepository中拉出部门来解析DepartmentRepository部门,但是这只是一个糟糕的,臭的设计和一个不可接受的“解决方案”。
此时我并不关心代码生成策略(尽管POCO会很好),我真的只需要一些可行的东西,并且实体框架4在创建模型定义时并不是很糟糕我想坚持下去。
答案 0 :(得分:0)
检查上下文中的Detach和Attach方法。您可以从一个上下文中分离实体并将其附加到另一个上下文。但在这种情况下,您将丢失更改跟踪,您必须通过context.ObjectStateManager.ChangeObjectState手动设置实体的状态。
但是你应该考虑设计你的应用程序。在上述场景中,您不应该使用两个不同的对象上下文。
答案 1 :(得分:0)
问题的根本原因是您需要分隔两个存储库之间的数据上下文。为了管理多对多关系,EF依赖于一个对象上下文中的所有内容。
如果你真的需要在这两个上下文之间强制分离,你可以明确地模拟多对多关系,即将中间对象作为两个多对一关系:
Department - DepartmentEmployee - Employee
在两种情况下,DepartmentEmployee对象都是“已知的”。通过DepartmentRepository,您可以添加/删除员工(仅通过他们的Id),反之亦然。从DepartmentEmployee到Department或Employee都不应该有导航属性。