【问题标题】:Entity Framework 4 CTP 5 POCO - Many-to-many or Lookup table?实体框架 4 CTP 5 POCO - 多对多还是查找表?
【发布时间】:2011-06-03 02:53:44
【问题描述】:

我正在构建一个仅使用 Entity Framework 4 CTP 5 POCO 的个人博客应用,其中 Post 可以有许多 Tags 和一个 Tag 可以出现在许多帖子中。我的问题是是否构建一个多对多模型,或者有一个查找表。

起初我尝试使用多对多,但我不知道如何插入,每次发布新帖子(选择了许多标签),我不知道该怎么做标签应该与帖子相关联(如果标签名称已经存在,则不会插入新标签。)

然后我尝试像这样构建一个查找表:

发帖

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()
        };

关于如何完成这项任务的任何建议?非常感谢!

【问题讨论】:

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


    【解决方案1】:

    过去几天我一直在苦苦挣扎,并决定按预期使用 Lookup 表,并且在 Lookup 表中,也有对 Post 和 Tag 模型的引用:

    public class PostTagLookup
    {
        public int Id { get; set; }
        public int PostId { get; set; }
        public int TagId { get; set; }
    
        public virtual Post Post { get; set; }
        public virtual Tag Tag { get; set; }
    }
    

    可能不是最好的方法,但它正在工作:) 谢谢大家的关注。

    【讨论】:

      【解决方案2】:

      我认为您的模型应该按原样工作,只需稍作调整:将 ID 列/字段添加到 PostTagLookup 实体。

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

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

      【讨论】:

      • 我尝试了多对多但没有成功(这是我最初的问题:stackoverflow.com/questions/4571188/…),它在与对象相关的某些内容上引发错误,并没有在 The_Smallest 建议。然后还有另一个建议说我应该使用查找表,没有Id 列!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2011-06-02
      • 2011-06-30
      • 2011-04-18
      相关资源
      最近更新 更多