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