gpt4 book ai didi

c# - 无法同时保存修改后的实体和新实体

转载 作者:行者123 更新时间:2023-11-30 16:15:55 25 4
gpt4 key购买 nike

让我们想象一下这个 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

我的应用程序中有一个页面,我可以在其中同时管理 PersonAddress。在此页面中,我可以在单个 Breeze saveChanges() 调用中创建一个 Person 和许多 Address

它工作正常,除非我尝试修改 Person 属性并同时添加新的 Address

这是 Breeze Web API Controller 正在接收的 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 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。

我不知道发生了什么,但 Breeze 保存这些实体的方式似乎导致 Entity Framework 状态管理器中的实体重复。

有没有人知道如何解决/解决这个问题?是 Breeze 中的错误,还是我做的不正确?

顺便说一下,我正在运行 Breeze 1.4.2 和 Entity Framework 5.0.0

最佳答案

我找到了问题的答案。

实际上,我在保存之前使用 Breeze 的 BeforeSaveEntities 委托(delegate)执行了一些验证。问题是,如果您在这些验证期间从 DBContext 中检索一个实体,并且稍后将同一实体保存为 JObject 的一部分提交给 Breeze Controller ,您会遇到问题。

我使用的解决方法是将这些验证作为 AfterSaveEntities Hook 执行,并告诉 Breeze 使用事务。

关于c# - 无法同时保存修改后的实体和新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19031318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com