【问题标题】:EF Code first: Insert Many to manyEF 代码优先:插入多对多
【发布时间】:2012-07-18 23:18:11
【问题描述】:

一篇文章可以有多个主题。一个主题可以分配给许多帖子。 添加从主题列表中选择的两个主题的帖子时,两个NULL 主题也插入到我的主题表中。请参阅 Id=3435。我做错什么了?不应更改主题。我正在添加一个新帖子并从固定数量的主题(下拉列表)中选择主题。它在 PostTopics 表(PostID、TopicID)中被跟踪。

主题表:

Id    TopicName   TopicDesc       
31    Sports  Sports  
32    Game    Game    
33    Politics    Politics    
34    NULL    NULL    
35    NULL    NULL

TopicPosts 表:

Topic_Id    Post_Id
34  11
35  11


public class Post
{
    public int Id { get; set; }
    public int UserId { get; set; }

    public virtual ICollection<Topic> PostTopics { get; set; }

}


public class Topic
{
    public int Id { get; set; }
    public string TopicName { get; set; }

    public virtual ICollection<Request> Requests { get; set; }

}

// insert code: I think the problem is here

  using (var context = new ChatContext())
  {
             // Post
             context.Posts.Add(pobjPost);

             pobjPost.PostTopics = new List<Topic>();
             // topics
             foreach (var i in pobjTopics)
             {

             pobjPost.PostTopics.Add(i);
             }

             context.SaveChanges();
   }

【问题讨论】:

  • 包含一些变量的来源代码可能会有所帮助(pobjPostpobjTopics
  • 它们来自我的 UI 层。我不想让你厌烦细节。
  • 不只是foreach (var i in pobjTopics.Where(t =&gt; t.TopicName != null))吗?
  • 不应更改主题。我正在添加一个新帖子并从固定数量的主题(下拉列表)中选择主题。它在 PostTopics 表(PostID、TopicID)中被跟踪。

标签: c# entity-framework ef-code-first


【解决方案1】:

您必须首先将主题附加到上下文以将它们置于状态Unchanged 并告诉 EF 它们已经存在于数据库中。否则 EF 将假定主题是新的并将它们插入到数据库中。之后,您可以将帖子添加到上下文中,以便可以将帖子作为新实体与多对多连接表中的关系记录一起插入到数据库中:

using (var context = new ChatContext())
{
    pobjPost.PostTopics = new List<Topic>();
    foreach (var pobjTopic in pobjTopics)
    {
        context.Topics.Attach(pobjTopic); // topic is in state Unchanged now
        pobjPost.PostTopics.Add(pobjTopic);
    }
    context.Posts.Add(pobjPost); // post in state Added, topics still Unchanged
    context.SaveChanges();
}

【讨论】:

    【解决方案2】:

    要创建关系,应首先将两个相关对象附加到上下文中。

    试试这个方法:

    using (var context = new ChatContext())
          {
                     // Post
                     context.Posts.Attach(pobjPost);
    
                     pobjPost.PostTopics = new List<Topic>();
                     // topics
                     foreach (var i in pobjTopics)
                     {
    
                     pobjPost.PostTopics.Add(i);
                     }
    

    【讨论】:

    • 出现 FK 错误。 "INSERT 语句与 FOREIGN KEY 约束冲突"
    • 我认为主题也应该在定义关系之前附加到上下文中。我已经用数据库优先方法做了类似的事情,这里是添加作者和书籍之间关系的代码db.Books.Attach(book); foreach (Author a in authors) { db.Authors.Attach(a); } book.Authors.Clear(); foreach (Author a in authors) { book.Authors.Add(a); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多