2011-08-12 137 views
0

我面對的問題是,無論何時我調用events.Tags.Add(tag)並調用在上下文中保存更改,它最終會在Tags表中創建一個新的標記信息,而不僅僅是將EventId和TagId插入到EventTags表中。保存到多對多的關係

基於以下數據,我如何將事件和標籤添加到EventTags表中。比方說,我想添加Id = 2的事件,和Id = 1的標記到EventTags表。

我有以下實體。

public class Event 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<Tag> Tags { get; set; } 
    } 


    public class Tag 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public virtual ICollection<Event> Events { get; set; } 
    } 

     public class EventConfiguration : EntityTypeConfiguration<Event> { 
      public EventConfiguration() { 
       ToTable("Events"); 
       HasKey(x => x.Id).Property(x => x.Id).HasColumnName("Id").IsRequired(); 
       Property(x => x.Name).HasColumnName("Name").IsRequired(); 

     HasMany(x => x.Tags) 
        .WithMany(x => x.Events) 
        .Map(m => { 
         m.ToTable("EventTags"); 
         m.MapLeftKey("EventId"); 
         m.MapRightKey("TagId"); 
        }); 
      } 
     } 


    public class TagConfiguration : EntityTypeConfiguration<Tag> { 
      public TagConfiguration() { 
       ToTable("Tags"); 
       HasKey(x => x.Id).Property(x => x.Id).HasColumnName("Id").IsRequired(); 
       Property(x => x.Name).HasColumnName("Name").IsRequired(); 
      } 
     } 



/* 
These are the records in my many to many tables 

-------------- 

Events Table 

-------------- 

Id Name 

1 Test1 

2 Test2 



-------------- 

EventTags 

------------- 

EventId TagId 

1  2 



------------- 

Tags 

------------ 

Id Name 

1 MVC 

2 C# 
*/ 
+1

發佈您的添加代碼 - 是您添加從相同的DBContext獲取的標籤嗎? – Andiih

回答

0

可以說,我想用ID = 2和與ID = 1的標籤添加事件到 EventTags表。

using (var context = new MyContext()) 
{ 
    // Load the event 
    var theEvent = context.Events.Find(2); 
    // Load the tag  
    var theTag = context.Tags.Find(1); 

    // Add tag to Tags collection of the event 
    theEvent.Tags.Add(theTag); 

    // Save 
    context.SaveChanges(); 
} 

這足以更新這兩個收藏品之一。 EF會自動處理其他收集。

編輯

,而不從數據庫加載實體,如果你知道現有的入侵檢測系統的另一種選擇:

using (var context = new MyContext()) 
{ 
    // Create an event with Id 2 
    var theEvent = new Event { Id = 2, Tags = new HashSet<Tag>() }; 
    // Create a tag with Id 1 
    var theTag = new Tag { Id = 1 }; 

    // Attach both event and tag to the context 
    context.Events.Attach(theEvent); 
    context.Tags.Attach(theTag); 

    // Add tag to Tags collection of the event 
    theEvent.Tags.Add(theTag); 

    // Save 
    context.SaveChanges(); 
} 

你也可以混合兩種方法,從DB例如負載事件,創建和附上標籤。

+0

謝謝你會嘗試。 – Edd