我创建了映射到实体域模型中的实体的POCO域对象。 到目前为止,当我必须处理多对多关系时,一切都运转正常。
假设我有三张桌子
- 博客
- BlogTag
- 标记
您可以看到博客和标签是多对多的桥接表,BlogTag包含两个表的外键。
我也有相应的域名模型:
- 博客
- BlogsTags
- 标签
现在,我选择了一个博客列表,我正试图从博客中访问特定的标签。
myBlog.BlogsTags [0] .TAG
BlogTags [0]。填写了TagForeignKey,但BlogTags [0] .Tag null !!
我也开启了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关键字的相关对象列表。
答案 0 :(得分:2)
BlogTag根本不应该是一个实体:它只是一种关系,它不包含任何实际数据。如果使用外键在数据库中正确建模关系,实体模型设计者应该意识到并从概念模型中消除BlogTag ......
编辑:
我不确定为什么延迟加载在这里不起作用,但您可以始终使用Include
明确加载Tag
:
var myBlog = context.Blogs.Include("BlogTags.Tag").First(b => b.Id = blogId);
var tag = myBlog.BlogsTags[0].Tag;
答案 1 :(得分: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!
}