Entity Framework 多对多关系更新
Entity Framework many to many relationship updating
如何更新多对多导航属性?
我想更新实体我收到错误消息
have the same primary key value
我知道有办法将多对多关系拆分为两个多对一关系,但事实就是如此。更新多对多关系。
我这样做是为了添加带有导航 属性 的新实体没有问题,但是更新时出现错误。我试图在更新中删除db.Entry(item).State = ...
,但问题仍然存在。
public class TrendChart
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<ParameterMonitor> Monitors { get; set; }
}
public class ParameterMonitor
{
public int Id { get; set; }
public virtual List<TrendChart> Charts{ get; set; }
}
var db = new DataAccess.ApplicationDbContext();
var newTrendChart = db.TrendChart.Where(x => x.Id == trendChart.Id).FirstOrDefault();
if (newTrendChart != null)
{
if (newTrendChart.Monitors != null)
newTrendChart.Monitors.Clear();
newTrendChart.Name = trendChart.Name;
newTrendChart.Monitors = new List<ParameterMonitor>();
foreach (var item in trendChart.Monitors)
{
newTrendChart.Monitors.Add(new DataAccess.ParameterMonitor { MOParameterId = item.MoParameterId });
}
// prevent from adding new parameter
foreach (var item in newTrendChart.Monitors)
{
// here the ERROR happens
db.Entry(item).StateSystem.Data.Entity.EntityState.Unchanged;
}
db.SaveChanges();
}
我找到了解决方案,关键是每当你尝试在中间添加一些东西时 table CLEAR() 函数不会删除我们看不到的幕后项目的历史记录,请考虑中间有两个项目 table , 1,2 和 1,3 。如果您只想将 table 更新为 1,2 ,则意味着清除函数删除 1,2 和 1,3 并再次添加 1,2。但它不起作用,因为幕后已经有一个项目 1,2。我们需要删除()1,3并且不关心1,2。有没有其他解决方案。
var tempMOList = new List<int>();
tempMOList = newTrendChart.Monitors.Select(x=> x.MOParameterId).ToList();
foreach (var id in tempMOList)
{
var temp = newTrendChart.Monitors.Where(x => x.MOParameterId == id).FirstOrDefault();
if (trendChart.Monitors.Any(x => x.MoParameterId == id) == false)
newTrendChart.Monitors.Remove(temp);
}
foreach (var item in trendChart.Monitors)
{
if (newTrendChart.Monitors.Any(x => x.MOParameterId == item.MoParameterId) == false)
newTrendChart.Monitors.Add(new DataAccess.ParameterMonitor { MOParameterId = item.MoParameterId });
}
//prevent from adding new parameter
foreach (var item in newTrendChart.Monitors)
{
db.Entry(item).State = System.Data.Entity.EntityState.Unchanged;
}
db.SaveChanges();
如何更新多对多导航属性?
我想更新实体我收到错误消息
have the same primary key value
我知道有办法将多对多关系拆分为两个多对一关系,但事实就是如此。更新多对多关系。
我这样做是为了添加带有导航 属性 的新实体没有问题,但是更新时出现错误。我试图在更新中删除db.Entry(item).State = ...
,但问题仍然存在。
public class TrendChart
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<ParameterMonitor> Monitors { get; set; }
}
public class ParameterMonitor
{
public int Id { get; set; }
public virtual List<TrendChart> Charts{ get; set; }
}
var db = new DataAccess.ApplicationDbContext();
var newTrendChart = db.TrendChart.Where(x => x.Id == trendChart.Id).FirstOrDefault();
if (newTrendChart != null)
{
if (newTrendChart.Monitors != null)
newTrendChart.Monitors.Clear();
newTrendChart.Name = trendChart.Name;
newTrendChart.Monitors = new List<ParameterMonitor>();
foreach (var item in trendChart.Monitors)
{
newTrendChart.Monitors.Add(new DataAccess.ParameterMonitor { MOParameterId = item.MoParameterId });
}
// prevent from adding new parameter
foreach (var item in newTrendChart.Monitors)
{
// here the ERROR happens
db.Entry(item).StateSystem.Data.Entity.EntityState.Unchanged;
}
db.SaveChanges();
}
我找到了解决方案,关键是每当你尝试在中间添加一些东西时 table CLEAR() 函数不会删除我们看不到的幕后项目的历史记录,请考虑中间有两个项目 table , 1,2 和 1,3 。如果您只想将 table 更新为 1,2 ,则意味着清除函数删除 1,2 和 1,3 并再次添加 1,2。但它不起作用,因为幕后已经有一个项目 1,2。我们需要删除()1,3并且不关心1,2。有没有其他解决方案。
var tempMOList = new List<int>();
tempMOList = newTrendChart.Monitors.Select(x=> x.MOParameterId).ToList();
foreach (var id in tempMOList)
{
var temp = newTrendChart.Monitors.Where(x => x.MOParameterId == id).FirstOrDefault();
if (trendChart.Monitors.Any(x => x.MoParameterId == id) == false)
newTrendChart.Monitors.Remove(temp);
}
foreach (var item in trendChart.Monitors)
{
if (newTrendChart.Monitors.Any(x => x.MOParameterId == item.MoParameterId) == false)
newTrendChart.Monitors.Add(new DataAccess.ParameterMonitor { MOParameterId = item.MoParameterId });
}
//prevent from adding new parameter
foreach (var item in newTrendChart.Monitors)
{
db.Entry(item).State = System.Data.Entity.EntityState.Unchanged;
}
db.SaveChanges();