保存到多对多关系

Posted

技术标签:

【中文标题】保存到多对多关系【英文标题】:Saving to a many to many relationship 【发布时间】:2011-08-12 14:17:00 【问题描述】:

面临的问题是,每当我调用 events.Tags.Add(tag) 并在上下文中调用 Save changes 时,它最终都会在 Tags 表中创建一个新的标签信息,而不是仅仅将 EventId 和 TagId 插入EventTags 表。

根据以下数据,如何将事件和标签添加到 EventTags 表中。假设我想将 Id=2 的 Event 和 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#
*/

【问题讨论】:

发布您的添加代码 - 您添加的标签是从同一个 DBContext 获取的吗? 【参考方案1】:

假设我想将 Id=2 的 Event 和 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 会自动处理其他集合。

编辑

如果您知道现有的 Id,则无需从数据库加载实体的另一个选项:

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

您也可以混合使用这两种方法,例如从数据库加载事件、创建和附加标签。

【讨论】:

以上是关于保存到多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Django 保存到多对多字段

如何在 Laravel 中检索链接到多对多关系的模型?

没有链接表/模型的多对多关系?

SSH高速进阶——Hibernate 多对多映射

TypeError:禁止直接分配到多对多集合的前向端。请改用 meeting.set()。 Django m2m 字段出错

保存多对多关系,同步/附加不存在?