2009-12-15 85 views
3

我创建了映射到实体域模型中的实体的POCO域对象。 一切都很好,直到现在,当我必须与多对多的关系工作。实体框架4.0 POCO和多对多问题

假设我有三张桌子。
- 博客
- BlogTag
- 标签

可以看出,博客和标签是多到许多与桥台,BlogTag包含一个外键两个表。

我也有相应的域模型:
- 博客
- BlogsTags
- 标签

现在,我选择博客的名单,我试图从博客访问特定的标签。

myBlog.BlogsTags [0] .TAG

BlogTags [0] .TagForeignKey填充,但BlogTags [0] .TAG是 !!

我也打开了LazyLoading。

我会做什么错?

谢谢。

好的。这里有一些源代码。

我的上下文类

public class MyContext : ObjectContext 
    { 
     public MyContext() : base(Utility.GetConnectionString(...), "containerName") 
     { 
      Blogs = CreateObjectSet<Blog>(); 
      BlogsTags = CreateObjectSet<BlogTag>(); 
      Tags = CreateObjectSet<Tags>(); 

      base.ContextOptions.LazyLoadingEnabled = true; 
     } 

     public ObjectSet<Blog> Blogs { get; private set; } 
     public ObjectSet<BlogTag> BlogsTags { get; private set; } 
     public ObjectSet<Tags> Tags { get; private set; } 
    } 

和我的POCO类只需要通过虚拟关键字相关对象的列表。

+0

多一点的代码可以帮助诊断问题。我可以验证多对多工作正常。我有许多用户实体可以有很多角色,反之亦然。 我正在使用存储库模式,其中我有一个通用存储库,其中包含一个返回活动EF上下文的对象上下文属性。在EF上下文检索的构造函数中,我将Lazyloading设置为true: base.ContextOptions.LazyLoadingEnabled = true; – Jay 2009-12-16 16:37:36

回答

2

BlogTag不应该是一个实体:它只是一种关系,它不包含任何实际的数据。如果关系在数据库中使用外键正确建模,实体模型设计人员应该认识到,并从概念模型消除BlogTag ...


编辑:

我不知道为什么懒惰装载不在这里工作,但你总是可以使用Include加载Tag明确:

var myBlog = context.Blogs.Include("BlogTags.Tag").First(b => b.Id = blogId); 
var tag = myBlog.BlogsTags[0].Tag; 
+0

假设需要BlogTag(包含更多列),EF会自动计算出它具有其他列并将该实体添加到模型中。对我来说没有意义的是为什么Tag属性始终为空。 – 2009-12-15 23:28:49

+0

这不起作用。这是我的方式,但它不会工作。我也意识到,从多人到多人的情况总是如此。那一个属性总是空的。这听起来像是一个可能的bug在测试版 – 2009-12-16 17:41:39

0

确保你是在实体访问关系属性被定义为“虚拟”,否则它们不会被自动遍历。

我有同样的问题...例如。我的用户实体的:

public class User : EntityBase 
    { 
     public int UserID { get; set; } 
     public string Username { get; set; } 
     public string Email { get; set; } 
     public virtual List<Role> Roles { get; set; } //VIRTUAL here is KEY! 
} 

我假设你的应该是:

public class Blog 
     { 

    public string Owner { get; set; } 
    public string BlogText { get; set; } 
    public virtual List<BlogTag> BlogTags { get; set; } //VIRTUAL here is KEY! 

    } 
+0

是的,他们已经是虚构的。它需要延迟加载。 – 2009-12-16 21:44:16