我有以下更新功能
public void UpdateBatchDefinition(BatchDefinition batchToUpdate)
{
if (batchToUpdate == null)
{
throw new ArgumentNullException("batchToUpdate");
}
BatchDefinition foundDefinition =
this.context.BatchDefinitions.SingleOrDefault(definition => definition.Id == batchToUpdate.Id);
if (foundDefinition != null)
{
if (!string.IsNullOrWhiteSpace(batchToUpdate.Name))
{
foundDefinition.Name = batchToUpdate.Name;
}
if (!string.IsNullOrWhiteSpace(batchToUpdate.Description))
{
foundDefinition.Description = batchToUpdate.Description;
}
if (!string.IsNullOrWhiteSpace(batchToUpdate.LoadType))
{
foundDefinition.LoadType = batchToUpdate.LoadType;
}
if (batchToUpdate.JobId != Guid.Empty)
{
foundDefinition.JobId = batchToUpdate.JobId;
}
foundDefinition.Tables = batchToUpdate.Tables;
this.context.SaveChanges();
}
}
我遇到的问题是在我尝试更新“表”列表时。表是表的列表,表是另一个表的实体
可以添加,删除或单独使用表格。我需要用
中传递的内容来更新它当我现在运行时,我收到'EntityValidationErrors'错误,但它不会告诉我实际上验证的是什么。
关于插入我遇到了同样的错误但是能够使用以下
修复它var underlyingContext = this.context as DbContext;
if (underlyingContext != null)
{
foreach (var table in batchDefinition.Tables)
{
// Need to mark the table entity as unchanged or
// else EF will treat it as a new table
underlyingContext.Entry(table).State = EntityState.Unchanged;
}
}
所以我尝试在此更新功能中使用它
var underlyingContext = this.context as DbContext;
if (underlyingContext != null)
{
foreach (var table in foundDefinition.Tables)
{
// Need to mark the table entity as unchanged or
//else EF will treat it as a new table
underlyingContext.Entry(table).State = EntityState.Unchanged;
}
}
foundDefinition.Tables = batchToUpdate.Tables;
我得到以下错误:
AcceptChanges无法继续,因为对象的键值发生冲突 与ObjectStateManager中的另一个对象。确保密钥 在调用AcceptChanges之前,这些值是唯一的。
有什么想法,我在这里缺少什么?
答案 0 :(得分:0)
更改更新方法的结束,如下所示:
foreach (var t in foundDefinition.Tables.ToList())
Context.Tables.Remove(t);
foundDefinition.Tables = batchToUpdate.Tables;
this.context.SaveChanges();
关于你的上一个错误,据说在你的上下文中有一些重复。因此,EF无法将上下文更改保存到db中(因为上下文中存在重复项!)
事实上,我不知道最后一个错误来自添加或删除 - 你没有提到清楚。所以,我不知道最后两个代码示例是来自你的add方法,还是你的更新方法...
然而,对于更新,我在这里提到的技巧必须解决您的更新问题......