2011-08-12 16 views
0

問題は直面しています.Tags.Add(タグ)を呼び出し、コンテキストに変更を保存すると、いつでもタグテーブルに新しいタグ情報が作成されますEventIdとTagIdをEventTagsテーブルに挿入します。多対多の関係に保存

以下のデータを基にして、EventTagsテーブルにイベントとタグを追加するにはどうすればよいですか。 EventTagsテーブルに、Id = 2のイベントとId = 1のタグを追加したいとします。

私は次のエンティティを持っています。

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

は、私が EventTagsテーブルにID = 2とし、ID = 1のタグにイベントを追加したいとしましょう。

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

これは、2つのコレクションの一つを更新するだけで十分です。 EFは他のコレクションを自動的に処理します。

編集

別のオプションDBからエンティティをロードすることなく、既存のIds知っている場合:

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から例のloadイベントのために、両方のアプローチを混在させることができますし、タグを付けてください。

+0

ありがとうございます。 – Edd