2012-09-14 121 views
0

我有一些POCO类一般可以分为两类,例如: 是否有可能在两个DbContext之间共享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; } 
} 

和相应的课程和俱乐部类,它们都有自己的其他类的关系。

的问题是,这两个群体都大了,它们都含有大量的类,并且它们中的每一个工作单位,像学生课程管理单位将提供相关的课程什么功能;俱乐部管理部门将提供功能。所以我不打算把它们放到一个DbContext中。

有迹象表明,需要得到俱乐部的学生则检索其课程信息的一些要求。我现在正在做的是使用我从俱乐部单位获得的学生ID在课程单元中做另一个查询。其工作正常,但我跳,使其更简单,像

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

,但我得到了一些例外,像这样:

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

这可能吗?如果是这样,怎么样?谢谢〜

回答

2

您可以在多种环境映射单一类,但映射应该总是相同的。如果不相同,则不能使用动态代理(延迟加载),因为每个映射都需要处理其导航属性的自己的代理类型。

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

异常说,它不支持。有两个原因,这不能工作:

  • EF存储在静态辞典哪里即使你解决的第一个点(通过下载源代码和修改他们每个实体类型只能有一个生成的代理
  • 代理类型)你仍然无法做你想做的事,因为代理类型是实体。它不是一个包装。所以,当你从第一个环境中分离并附加到第二个环境时,这个类型不能被替换。
+0

真棒,非常感谢〜 – Ariex

1

如果您不需要延迟加载,只是从你的导航属性中删除了“虚拟”的关键字,也将努力为你想要的。虚拟用于启用延迟加载。

+0

的'virtual'关键字用来表明该方法可以通过从该继承的类被覆盖。 –

相关问题