0

我有一些 POCO 类,它们通常可以分为两组,例如:

public class Student
{
    public Student()
    {
        this.Courses = new List<Course>();
        this.Clubs = new List<Club>();
    }

    public int Id { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
    public virtual ICollection<Club> Clubs { get; set; }
}

以及相应的 Course 和 Club 类,它们与其他类都有自己的关系。

问题是,这两个组很大,它们都包含很多类,每个都是一个工作单元,就像学生课程管理单元一样,它会提供与课程相关的任何功能;和俱乐部管理单元,将提供功能。所以我不打算将它们放在一个 DbContext 中。

有一些要求需要从俱乐部获得学生然后检索其课程信息。我现在正在做的是使用我从俱乐部单元获得的学生 ID 在课程单元中进行另一个查询。效果很好,但我希望让它更简单,比如

foreach(var student in club.Students){
    ClubContext.Detach(student);
    CourseContext.Attach(student);
    foreach(var c in student.Courses){
      ...
    }
}

但我有一些这样的例外:

已经为对象层类型“POCOTest.Models.Student”生成了一个代理类型。当 AppDomain 中的两个或多个不同模型映射相同的对象层类型时,就会发生这种情况。

这可能吗?如果是这样,如何?谢谢~

4

2 回答 2

2

您可以在多个上下文中映射单个类,但映射应始终相同。如果不同,则不能使用动态代理(延迟加载),因为每个映射都需要自己的代理类型来处理其导航属性。

在您的情况下,第一个上下文映射包含Student与相关的实体,Club但该关系在第二个映射中不存在,其中Course存在相反的关系。这需要对同一实体类型使用两种不同的代理类型。

异常表示不支持。这不能工作的原因有两个:

  • EF 将代理类型存储在静态字典中,其中每个实体类型只能有一个生成的代理
  • 即使您修复了第一点(通过下载源代码并修改它们),您仍然无法做您想做的事情,因为代理类型是实体。它不是包装器。因此,当您将其从第一个上下文中分离并附加到第二个上下文时,无法替换该类型。
于 2012-09-14T19:29:31.447 回答
0

如果您不需要延迟加载,只需从导航属性中删除“virtual”关键字,它就会按您的意愿工作。Virtual 用于启用延迟加载。

于 2014-05-27T20:07:45.203 回答