的关系无法被改变..外键的属性是不可为空
问题描述:
我试图更新其已经exsit在DB型MamConfiguration_V1
的关系无法被改变..外键的属性是不可为空
的实体
它有几个参考成员(其中MamConfigurationToBrowser_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);
}
}
我得到以下DB运行时错误:
操作失败:无法更改关系,因为一个或多个外键属性不可空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。
但这很奇怪。所有引用不为空:
UPADTE 2:
我曾尝试这样的代码:
try
{
item.ThrowIfNull("item");
var itemFromDB = GetById(item.ConfigurationId);
if (itemFromDB != null)
{
UpdateEfItem(itemFromDB, item);
//mMaMDBEntities.MamConfiguration_V1.Detach(itemFromDB);
//mMaMDBEntities.MamConfiguration_V1.Attach(item);
//mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified);
//mMaMDBEntities.ObjectStateManager.ChangeObjectState(itemFromDB, System.Data.EntityState.Modified);
mMaMDBEntities.SaveChanges();
return item;
}
}
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.All(b => b.BrowserVersionId != item.BrowserVersionId))
{
mMaMDBEntities.MamConfigurationToBrowser_V1.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.BrowserVersionId == element.BrowserVersionId);
if (item != null)
{
// copy properties from element to item
}
else
{
element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
browserItem.BrowserID == element.BrowserID);
element.MamConfiguration_V1 = itemFromDb;
//have also tried: element.MamConfiguration_V1 = null;
//element.MamConfiguration_V1Reference = null;
itemFromDb.MamConfigurationToBrowser_V1.Add(element);
}
}
}
去这个错误:
{"Violation of UNIQUE KEY constraint 'UQ_MamConfigurations_V1'. Cannot insert duplicate key in object 'dbo.MamConfiguration_V1'. The duplicate key value is (elad_14Apr_1315).\r\nThe statement has been terminated."}
答
这条线......
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);
}
}
}
我得到'mMaMDBEntities.SaveChanges()这个错误;':{“UNIQUE KEY约束 'UQ_MamConfigurations_V1' 违反无法插入对象 'dbo.MamConfiguration_V1' 重复键。重复的键值是(elad_14Apr_1315)\ r \ n此语句已终止“} – 2013-04-21 13:51:24
@EladBenda:。做'itemFromUi.MamConfigurationToBrowser_V'集合中的项目有一个'MamConfigurations_V1'的参考?这将是一个问题,因为EF将尝试将它们与新项目一起插入。 – Slauma 2013-04-21 14:11:22
是的。在EF参考导航中是双向的。并且'itemFromUi.MamConfigurationToBrowser_V'中的所有新项目都指向现有的'MamConfigurations_V1'。我该怎么办? – 2013-04-21 14:20:58