保存到多对多关系
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();
您也可以混合使用这两种方法,例如从数据库加载事件、创建和附加标签。
【讨论】:
以上是关于保存到多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:禁止直接分配到多对多集合的前向端。请改用 meeting.set()。 Django m2m 字段出错