3

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

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

您可以看到 Blogs 和 Tags 是多对多的,带有一个桥表,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 类只有一个带有 virtual 关键字的相关对象列表。

4

2 回答 2

2

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


编辑:

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

var myBlog = context.Blogs.Include("BlogTags.Tag").First(b => b.Id = blogId);
var tag = myBlog.BlogsTags[0].Tag;
于 2009-12-15T22:38:48.623 回答
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!

    }
于 2009-12-16T21:23:53.933 回答