无法同时保存修改的实体和新实体
本文关键字:实体 新实体 保存 修改 | 更新日期: 2023-09-27 18:33:04
让我们想象一下这个EF模型:
public class Person
{
[Key]
public int Id {get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
public int Age { get; set; }
[InverseProperty("Person")]
public ICollection<Address> Addresses { get; set; }
}
public class Address
{
[Key]
public int Id {get; set; }
public int Number { get; set; }
public string Street { get; set; }
public string City { get; set; }
public int PersonId { get; set; }
[ForeignKey("PersonId")]
[InverseProperty("Adresses")]
public Person Person { get; set; }
}
一个Person
可以有很多Address
。
我的应用程序中有一个页面,我可以同时管理Person
和Address
。在此页面中,我可以在单个 Breeze saveChanges()
调用中创建Person
和许多Address
。
它工作正常,除非我尝试修改Person
属性并同时添加新Address
。
这是 Breeze Web API 控制器正在接收的JObject
类型:
{
"entities": [
{
"Id": -1,
"PersonId": 3,
"City": "Seattle",
"Street": "Main Av",
"Number": 1540,
"entityAspect": {
"entityTypeName": "Address:#MyApp.Models",
"defaultResourceName": "Addresses",
"entityState": "Added",
"originalValuesMap": {},
"autoGeneratedKey": {
"propertyName": "Id",
"autoGeneratedKeyType": "Identity"
}
}
},
{
"Id": 3,
"Name": "Doe",
"FirstName": "John",
"Age": 32,
"entityAspect": {
"entityTypeName": "Person:#MyApp.Models",
"defaultResourceName": "Persons",
"entityState": "Modified",
"originalValuesMap": {
"FirstName": "William"
},
"autoGeneratedKey": {
"propertyName": "Id",
"autoGeneratedKeyType": "Identity"
}
}
}
],
"saveOptions": {}
}
调用服务器端contextProvider.SaveChanges()
时,EF 抱怨并拒绝接受我的更改:
接受更改无法继续,因为对象的键值与对象状态管理器中的另一个对象冲突。在调用 AcceptChanges 之前,请确保键值是唯一的。
我不知道发生了什么,但似乎 Breeze 保存这些实体的方式会导致实体框架状态管理器中的实体重复。
有没有人知道如何修复/解决此问题?是微风中的错误,还是我做得不正确?
顺便说一下,我正在运行 Breeze 1.4.2 和实体框架 5.0.0
我找到了问题的答案。
实际上,我在保存之前使用 Bleeze 的BeforeSaveEntities
委托执行了一些验证。问题是,如果您在这些验证期间从DBContext
中检索实体,并且稍后将同一实体保存为提交给 Breeze 控制器的JObject
的一部分,则会遇到问题。
我使用的解决方法是将这些验证作为AfterSaveEntities
钩子执行,并告诉 Breeze 使用事务。