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