EF Core 多对多不保存到连接 table
EF Core many to many not saving into join table
我有以下类
public class Travel
{
public int Id { get; set; }
public string Location { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public List<Activity> Activities { get; set; }
public List<ActivityTravel> ActivitityTravels { get; set; } = new List<ActivityTravel>();
}
public class Activity
{
public int Id { get; set; }
public string Name { get; set; }
public List<ActivityTravel> ActivitityTravels { get; set; } = new List<ActivityTravel>();
}
public class ActivityTravel
{
public int TravelId { get; set; }
public Travel Travel { get; set; }
public int ActivityId { get; set; }
public Activity Activity { get; set; }
}
我的 ApplicationDbContext 看起来像这样
modelBuilder.Entity<ActivityTravel>()
.HasKey(at => new { at.ActivityId, at.TravelId });
modelBuilder.Entity<ActivityTravel>()
.HasOne(at => at.Activity)
.WithMany(a => a.ActivitityTravels)
.HasForeignKey(at => at.ActivityId);
modelBuilder.Entity<ActivityTravel>()
.HasOne(at => at.Travel)
.WithMany(t => t.ActivitityTravels)
.HasForeignKey(at => at.TravelId);
//outside of OnModelCreating
public DbSet<Travel> Travels { get; set; }
public DbSet<Activity> Activities { get; set; }
public DbSet<ActivityTravel> ActivityTravels { get; set; }
用户可以添加一个新的 Travel 以及一些已经存在的 Activites。但是每次将新的 Travel 添加到上下文中时,ActivityTravel 中不会添加任何内容。
这是用于添加新的 Travel
的代码
public async Task<ActionResult> AddTravel([FromBody] Travel travel)
{
travel.Activities.ForEach(a => travel.ActivitityTravels.Add(new ActivityTravel() { Activity = a, Travel = travel }));
_context.Travels.Add(travel);
//dont add activity again
travel.Activities.ForEach(a => _context.Entry(a).State = EntityState.Detached);
_context.SaveChanges();
return Ok();
}
我已经按照这个问题中的例子做了
你不应该分离你现有的 Activities
你需要先 attach 它们再处理其他东西,这样它们就不会被添加为重复项。像这样:
public async Task<ActionResult> AddTravel([FromBody] Travel travel)
{
travel.Activities.ForEach(a => travel.ActivitityTravels.Add(new ActivityTravel() { Activity = a, Travel = travel }));
_context.AttachRange(travel.Activities);
_context.Travels.Add(travel);
_context.SaveChanges();
return Ok();
}
我有以下类
public class Travel
{
public int Id { get; set; }
public string Location { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public List<Activity> Activities { get; set; }
public List<ActivityTravel> ActivitityTravels { get; set; } = new List<ActivityTravel>();
}
public class Activity
{
public int Id { get; set; }
public string Name { get; set; }
public List<ActivityTravel> ActivitityTravels { get; set; } = new List<ActivityTravel>();
}
public class ActivityTravel
{
public int TravelId { get; set; }
public Travel Travel { get; set; }
public int ActivityId { get; set; }
public Activity Activity { get; set; }
}
我的 ApplicationDbContext 看起来像这样
modelBuilder.Entity<ActivityTravel>()
.HasKey(at => new { at.ActivityId, at.TravelId });
modelBuilder.Entity<ActivityTravel>()
.HasOne(at => at.Activity)
.WithMany(a => a.ActivitityTravels)
.HasForeignKey(at => at.ActivityId);
modelBuilder.Entity<ActivityTravel>()
.HasOne(at => at.Travel)
.WithMany(t => t.ActivitityTravels)
.HasForeignKey(at => at.TravelId);
//outside of OnModelCreating
public DbSet<Travel> Travels { get; set; }
public DbSet<Activity> Activities { get; set; }
public DbSet<ActivityTravel> ActivityTravels { get; set; }
用户可以添加一个新的 Travel 以及一些已经存在的 Activites。但是每次将新的 Travel 添加到上下文中时,ActivityTravel 中不会添加任何内容。 这是用于添加新的 Travel
的代码 public async Task<ActionResult> AddTravel([FromBody] Travel travel)
{
travel.Activities.ForEach(a => travel.ActivitityTravels.Add(new ActivityTravel() { Activity = a, Travel = travel }));
_context.Travels.Add(travel);
//dont add activity again
travel.Activities.ForEach(a => _context.Entry(a).State = EntityState.Detached);
_context.SaveChanges();
return Ok();
}
我已经按照这个问题中的例子做了
你不应该分离你现有的 Activities
你需要先 attach 它们再处理其他东西,这样它们就不会被添加为重复项。像这样:
public async Task<ActionResult> AddTravel([FromBody] Travel travel)
{
travel.Activities.ForEach(a => travel.ActivitityTravels.Add(new ActivityTravel() { Activity = a, Travel = travel }));
_context.AttachRange(travel.Activities);
_context.Travels.Add(travel);
_context.SaveChanges();
return Ok();
}