2012-07-18 4 views
4

Сообщение может иметь много тем. Тема может быть назначена для многих сообщений. При добавлении сообщения с двумя темами, выбранными из списка тем, две темы NULL также включены в мою таблицу тем. См. Id=34 и 35. Что я сделал не так? Темы не должны изменяться. Я добавляю новое сообщение и выбираю темы из фиксированного количества тем (выпадающий список). Он отслеживается в таблице PostTopics (PostID, TopicID).EF Code first: Insert Many to many

Темы таблицы:

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

+0

Они из моего слоя пользовательского интерфейса. Я не хочу утомлять вас подробностями. – Frank

+0

Разве это не просто 'foreach (var i in pobjTopics.Where (t => t.TopicName! = Null))'? –

ответ

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

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

+0

Добавил в таблицу темы TopicPosts мой исходный вопрос. – Frank

+0

Я думаю, что темы должны также быть привязаны к контексту, прежде чем определять отношения. Я сделал аналогичный подход с базой данных, и вот код для добавления отношения между авторами и книгой 'db.Books.Attach (book); foreach (Автор a в авторах) { db.Authors.Attach (a); } book.Authors.Clear(); foreach (Автор а в авторах) { book.Authors.Add (a); } ' –