Сохранение отношения многих ко многим - PullRequest
0 голосов
/ 12 августа 2011

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я вызываю events.Tags.Add (tag) и вызываю Save изменения в контексте, в итоге создается новая информация о теге в таблице 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 Ответ

0 голосов
/ 12 августа 2011

Допустим, я хочу добавить событие с 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();
}

Вы также можете смешать оба подхода, например загрузить событие из БД, создать и прикрепить тег.

...