【发布时间】:2016-05-18 16:44:02
【问题描述】:
我正在尝试使用 EF 删除一个对象和其他一些子对象。这是我正在使用的方法:
public async Task<IHttpActionResult> Delete([FromBody]WordForm wordForm)
{
var olddObj = db.WordDefinitions
.Where(w => w.WordFormId == wordForm.WordFormId)
.AsNoTracking()
.ToList();
foreach (var wordDefinition in olddObj)
{
db.WordDefinitions.Attach(wordDefinition);
db.WordDefinitions.Remove(wordDefinition);
}
db.WordForms.Attach(wordForm);
db.WordForms.Remove(wordForm);
await db.SaveChangesAsync();
return Ok();
}
谁能向我解释为什么我会收到这条消息:
附加“Entities.Models.Core.WordDefinition”类型的实体 失败,因为相同类型的另一个实体已经具有相同的 主键值。使用“附加”方法或 将实体的状态设置为“未更改”或“已修改”(如果有) 图中的实体具有冲突的键值。这可能是因为 一些实体是新实体,尚未收到数据库生成的密钥 价值观。在这种情况下,使用“添加”方法或“添加”实体状态 跟踪图,然后将非新实体的状态设置为 “未更改”或“已修改”(视情况而定)。
这是对象定义:
public class WordForm
{
public string WordFormId { get; set; } // WordFormId (Primary key) (length: 20)
public int WordFormIdentity { get; set; } // WordFormIdentity
// Reverse navigation
public virtual System.Collections.Generic.ICollection<WordDefinition> WordDefinitions { get; set; } // WordDefinition.FK_WordDefinitionWordForm
public WordForm()
{
WordDefinitions = new System.Collections.Generic.List<WordDefinition>();
}
}
【问题讨论】:
-
您方法的第一部分已经将对象加载到图中,因此在删除之前无需附加它们。只需删除它们。第二个附件应该可以正常工作,但如果不是,您最好在删除之前将其加载到图表中。
-
谢谢,我现在试试,更新你的答案。
标签: asp.net entity-framework asp.net-web-api