2012-07-18 115 views
4

一篇文章可以有很多主题。一个主题可以分配给许多职位。 添加包含从主题列表中选择的两个主题的帖子时,两个NULL主题也会插入到我的主题表中。见Id=3435。我做错了什么?主题不应该改变。我添加了一个新帖子,并从固定数量的主题(下拉列表)中选择主题。它在PostTopics表(PostID,TopicID)中保持跟踪。EF代码优先:插入多对多

主题表:

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

或许,这将有助于包括一些你的变量来自哪里的代码('pobjPost','pobjTopics') – Guvante 2012-07-18 23:42:58

+0

它们来自我的UI层。我不想让你知道细节。 – Frank 2012-07-19 03:37:52

+0

它不只是'foreach(var i在pobjTopics.Where(t => t.TopicName!= null))'? – 2012-07-20 10:15:50

回答

3

必须首先重视的主题上下文将它们放到状态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(); 
} 
+0

牛眼。非常感谢!有效。 – Frank 2012-07-23 23:17:01

0

要创建关系,均与目的应被首先连接到上下文。

试试这个方法:

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); 
       } 
+0

得到了FK错误。 “INSERT语句与FOREIGN KEY约束冲突” – Frank 2012-07-19 03:48:10

+0

将TopicPosts表信息添加到我的原始问题中。 – Frank 2012-07-19 03:50:34

+0

我认为在定义关系之前还应将主题附加到上下文中。我已经完成了类似于数据库优先的方法,下面是添加作者与书籍之间关系的代码 'db.Books.Attach(book); foreach(作者a在作者中) { db.Authors.Attach(a); } book.Authors.Clear(); foreach(作者作者a) { book.Authors.Add(a); }' – 2012-07-19 05:49:38