我正在使用Entity Framework 4 CTP 5 POCO构建个人博客应用,其中帖子可以包含多个标记和标记可以在很多帖子。我的问题是,是建立一个多对多模型,还是有一个查找表。
起初我尝试使用多对多,但我不知道如何插入,每次发布一个新帖子(选择了许多标签),我不知道该怎么做标签应该与帖子相关联(如果标签名称已经存在,则不会插入新标签。)
然后我尝试构建一个Lookup表:发表
public class Post
{
public int Id { get; set; }
[Required]
[StringLength(512, ErrorMessage = "Title can't exceed 512 characters")]
public string Title { get; set; }
[Required]
[AllowHtml]
public string Content { get; set; }
public string FriendlyUrl { get; set; }
public DateTime PostedDate { get; set; }
public bool IsActive { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
public virtual ICollection<PostTagLookup> PostTagLookups { get; set; }
}
代码
public class Tag
{
public int Id { get; set; }
[Required]
[StringLength(25, ErrorMessage = "Tag name can't exceed 25 characters.")]
public string Name { get; set; }
public string FriendlyName { get; set; }
public virtual ICollection<PostTagLookup> PostTagLookups { get; set; }
}
PostTagsLookup
public class PostTagLookup
{
public int PostId { get; set; }
public int TagId { get; set; }
}
问题是我不确定EF将如何处理查找表(当我选择标签时,如何获取帖子的标签或帖子的集合)。使用下面的代码,我收到一条错误消息,说PostTagLookup没有Id密钥:
var getPosts = _post.GetLatestPosts(3).ToList();
var posts = from post in getPosts
select new PostModel
{
Id = post.Id,
Title = post.Title,
Content = post.Content,
FriendlyUrl = post.FriendlyUrl,
PostedDate = post.PostedDate,
IsActive = post.IsActive,
NumberOfComments = post.Comments.Count(),
PostTags = post.PostTagLookups.Where(p => p.PostId == post.Id).ToList()
};
有关如何完成此任务的任何建议?非常感谢你!
答案 0 :(得分:0)
我认为您的模型应该按原样进行轻微调整:向PostTagLookup实体添加ID列/字段。
public class PostTagLookup
{
[Key]
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public int PostTagLookupId { get; set; }
//etc.
}
但是,我不确定为什么你不希望EF自己处理底层的多对多。例如,当您有一个新的Post对象时,您只需在上下文中调用SaveChanges()
之前,将所有关联的标签添加到实例化的Post的标签集合中。这不适合你吗?
答案 1 :(得分:0)