C# 关系无法更改。。外键属性不可为空

C# 关系无法更改。。外键属性不可为空,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我正在尝试更新类型为MamConfiguration\u V1 private void UpdateEfItem(MamConfiguration_V1 itemFromDb, MamConfiguration_V1 itemFromUi) { itemFromDb.UpdatedDate = DateTime.Now; itemFromDb.Description = itemFromUi.Description; itemFr

我正在尝试更新类型为
MamConfiguration\u V1

  private void UpdateEfItem(MamConfiguration_V1 itemFromDb, MamConfiguration_V1 itemFromUi)
    {
        itemFromDb.UpdatedDate = DateTime.Now;

        itemFromDb.Description = itemFromUi.Description;

        itemFromDb.StatusId = itemFromUi.StatusId;

        itemFromDb.Name = itemFromUi.Name;

        itemFromDb.NumericTraffic = itemFromUi.NumericTraffic;

        itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic;

        itemFromDb.Type = itemFromUi.NumericTraffic;


        itemFromDb.MamConfigurationToBrowser_V1.Clear();



        for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
        {
            var elementToAdd = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);

            elementToAdd.Browser = mMaMDBEntities.Browsers.Single(browserItem => browserItem.BrowserID == elementToAdd.BrowserID);

            elementToAdd.MamConfiguration_V1 = itemFromDb;

            itemFromDb.MamConfigurationToBrowser_V1.Add(elementToAdd);
        }
数据库中已经存在哪个

它的参考成员很少(其中
MamConfigurationToBrowser\u V1

}

private void UpdateEfItem(MamConfiguration\u V1 itemFromDb,mamconfigu\u V1 itemFromUi)
{
itemFromDb.UpdateDate=DateTime.Now;
itemFromDb.Description=itemFromUi.Description;
itemFromDb.StatusId=itemFromUi.StatusId;
itemFromDb.Name=itemFromUi.Name;
itemFromDb.NumericTraffic=itemFromUi.NumericTraffic;
itemFromDb.PercentageTraffic=itemFromUi.PercentageTraffic;
itemFromDb.Type=itemFromUi.NumericTraffic;
foreach(itemFromDb.MamConfigurationToBrowser_V1.ToList()中的变量项)
{
if(itemFromUi.MamConfigurationToBrowser_V1.All(b=>b.BrowServersOnId!=item.BrowServersOnId))
{
mmamdbenties.MamConfigurationToBrowser_V1.DeleteObject(项);
}
}
对于(int i=0;ib.BrowserVersionId==element.BrowserVersionId);
如果(项!=null)
{
//将属性从元素复制到项
}
其他的
{
element.Browser=mmamdbenties.Browsers.Single(browserItem=>
browserItem.BrowserID==元素.BrowserID);
element.MamConfiguration_V1=itemFromDb;
//也尝试过:element.MamConfiguration\u V1=null;
//element.MamConfiguration\u V1Reference=null;
itemFromDb.MamConfigurationToBrowser_V1.Add(元素);
}
}
}
然后转到这个错误:

{“违反唯一密钥约束'UQ_\u V1'。无法 在对象“dbo.MamConfiguration_V1”中插入重复的键 重复的键值为(elad_14Apr_1315)。\r\n语句已被删除 终止。”}

这条线

itemFromDb.MamConfigurationToBrowser_V1.Clear();
…不仅将清除集合,而且还将集合中各个项目对父级
itemFromDb
的引用设置为
null
。这是对这些项目的修改,EF将尝试将它们保存到数据库中。它失败是因为(可能)引用是必需的,并且不能为
null

您必须采取不同的方法,即逐个更新集合中的项。您必须考虑到项目可能已在UI中删除、可能已修改以及可能已添加新项目。它看起来与此类似:

private void UpdateEfItem(MamConfiguration_V1 itemFromDb,
    MamConfiguration_V1 itemFromUi)
{
    itemFromDb.UpdatedDate = DateTime.Now;
    itemFromDb.Description = itemFromUi.Description;
    itemFromDb.StatusId = itemFromUi.StatusId;
    itemFromDb.Name = itemFromUi.Name;
    itemFromDb.NumericTraffic = itemFromUi.NumericTraffic;
    itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic;
    itemFromDb.Type = itemFromUi.NumericTraffic;

    foreach (var item in itemFromDb.MamConfigurationToBrowser_V1.ToList())
    {
        if (!itemFromUi.MamConfigurationToBrowser_V1.Any(b =>
            b.BrowserID == item.BrowserID)
        {
            mMaMDBEntities.Browsers.DeleteObject(item);
        }
    }

    for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
    {
        var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);
        var item = itemFromDb.MamConfigurationToBrowser_V1
            .SingleOrDefault(b => b.BrowserID == element.BrowserID);
        if (item != null)
        {
            // copy properties from element to item
        }
        else
        {
            element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
                browserItem.BrowserID == element.BrowserID);

            itemFromDb.MamConfigurationToBrowser_V1.Add(element);
        }
    }
}
private void UpdateEfItem(MamConfiguration\u V1 itemFromDb,
MamConfiguration_V1 itemFromUi)
{
itemFromDb.UpdateDate=DateTime.Now;
itemFromDb.Description=itemFromUi.Description;
itemFromDb.StatusId=itemFromUi.StatusId;
itemFromDb.Name=itemFromUi.Name;
itemFromDb.NumericTraffic=itemFromUi.NumericTraffic;
itemFromDb.PercentageTraffic=itemFromUi.PercentageTraffic;
itemFromDb.Type=itemFromUi.NumericTraffic;
foreach(itemFromDb.MamConfigurationToBrowser_V1.ToList()中的变量项)
{
如果(!itemFromUi.MamConfigurationToBrowser_V1.Any(b=>
b、 BrowserID==item.BrowserID)
{
mmamdbenties.Browsers.DeleteObject(项);
}
}
对于(int i=0;ib.BrowserID==element.BrowserID);
如果(项!=null)
{
//将属性从元素复制到项
}
其他的
{
element.Browser=mmamdbenties.Browsers.Single(browserItem=>
browserItem.BrowserID==元素.BrowserID);
itemFromDb.MamConfigurationToBrowser_V1.Add(元素);
}
}
}

我在
mmamdbenties.SaveChanges();
上发现此错误:{“违反唯一键约束'UQ\u MamConfigurations\u V1'。无法在对象'dbo.MamConfiguration\u V1'中插入重复键。重复键值为(elad\u 14Apr\n语句已终止。“}@EladBenda:
itemFromUi.MamConfigurationToBrowser\u V
集合中的项是否引用了
MamConfigurations\u V1
?这将是一个问题,因为EF将尝试将它们与新项一起插入。是的。EF引用中的导航是双向的。而
itemFromUi.mamConfiguration中的所有新项都是双向的nToBrowser\u V
引用现有的
MamConfigurations\u V1
。我该怎么办?@EladBenda:尝试在
var element=…
行之后直接将引用设置为
null
itemFromDb
。但我已经这样做了:
elementToAdd.MamConfiguration\u V1=itemFromDb;
itemFromDb.MamConfigurationToBrowser_V1.Clear();
private void UpdateEfItem(MamConfiguration_V1 itemFromDb,
    MamConfiguration_V1 itemFromUi)
{
    itemFromDb.UpdatedDate = DateTime.Now;
    itemFromDb.Description = itemFromUi.Description;
    itemFromDb.StatusId = itemFromUi.StatusId;
    itemFromDb.Name = itemFromUi.Name;
    itemFromDb.NumericTraffic = itemFromUi.NumericTraffic;
    itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic;
    itemFromDb.Type = itemFromUi.NumericTraffic;

    foreach (var item in itemFromDb.MamConfigurationToBrowser_V1.ToList())
    {
        if (!itemFromUi.MamConfigurationToBrowser_V1.Any(b =>
            b.BrowserID == item.BrowserID)
        {
            mMaMDBEntities.Browsers.DeleteObject(item);
        }
    }

    for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
    {
        var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);
        var item = itemFromDb.MamConfigurationToBrowser_V1
            .SingleOrDefault(b => b.BrowserID == element.BrowserID);
        if (item != null)
        {
            // copy properties from element to item
        }
        else
        {
            element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
                browserItem.BrowserID == element.BrowserID);

            itemFromDb.MamConfigurationToBrowser_V1.Add(element);
        }
    }
}