实体框架4 CTP 5 POCO - 多对多或查找表?

时间:2011-01-03 23:09:27

标签: asp.net-mvc entity-framework-4 many-to-many entity-relationship lookup

我正在使用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()
        };

有关如何完成此任务的任何建议?非常感谢你!

2 个答案:

答案 0 :(得分:0)

我认为您的模型应该按原样进行轻微调整:向PostTagLookup实体添加ID列/字段。

public class PostTagLookup
{
    [Key]
    [DatabaseGenerated(DatabaseGenerationOption.Identity)]
    public int PostTagLookupId { get; set; }

    //etc.
}

但是,我不确定为什么你不希望EF自己处理底层的多对多。例如,当您有一个新的Post对象时,您只需在上下文中调用SaveChanges()之前,将所有关联的标签添加到实例化的Post的标签集合中。这不适合你吗?

答案 1 :(得分:0)