【问题标题】:Entity Framework 4.0 POCO and Many-to-Many problemEntity Framework 4.0 POCO 和多对多问题
【发布时间】:2009-12-15 20:16:19
【问题描述】:

我创建了映射到实体域模型中的实体的 POCO 域对象。 直到现在我必须处理多对多关系时,一切都运行良好。

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

您可以看到博客和标签是多对多的,有一个桥表,BlogTag 包含两个表的外键。

我也有对应的领域模型:
- 博客
- 博客标签
- 标签

现在,我选择了一个博客列表,并尝试访问博客中的特定标签。

myBlog.BlogsTags[0].Tag

BlogTags[0].TagForeignKey 填了,但是 BlogTags[0].Tag 是 null !!

我也开启了延迟加载。

我可能做错了什么?

谢谢。

好的。这是一些源代码。

我的上下文类

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 类只有一个带有 virtual 关键字的相关对象列表。

【问题讨论】:

  • 更多代码可能有助于诊断问题。我可以验证多对多工作正常。我有很多用户实体,它们可以有很多角色,反之亦然。我正在使用存储库模式,其中我有一个通用存储库,它具有返回活动 EF 上下文的对象上下文属性。在 EF 上下文检索的构造函数中,我将 Lazyloading 设置为 true:base.ContextOptions.LazyLoadingEnabled = true;

标签: entity-framework poco


【解决方案1】:

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


编辑:

我不确定为什么延迟加载在这里不起作用,但您始终可以使用Include 显式加载Tag

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

【讨论】:

  • 假设需要 BlogTag(包含更多列),它确实需要,并且 EF 自动发现它还有其他列并将该实体添加到模型中。对我来说没有意义的是为什么 Tag 属性总是显示为 null。
  • 这行不通。这就是我的方式,但它不会工作。我还意识到,从多到一时总是如此。 One 属性始终为空。这听起来像是测试版中可能存在的错误
【解决方案2】:

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

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

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!

    }

【讨论】:

  • 是的,它们已经是病毒了。延迟加载需要它。
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多