C# 不能同时保存修改后的实体和新实体
让我们想象一下这个EF模型:C# 不能同时保存修改后的实体和新实体,c#,entity-framework,breeze,C#,Entity Framework,Breeze,让我们想象一下这个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<
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; }
}
调用contextProvider.SaveChanges()
server-side时,EF抱怨并拒绝接受我的更改:
AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。
我不知道发生了什么,但Breeze保存这些实体的方式似乎会导致实体框架状态管理器中出现重复的实体
有人知道如何解决这个问题吗?是微风中的虫子,还是我做得不对?
顺便说一下,我正在使用Breeze 1.4.2和Entity Framework 5.0.0运行,我找到了问题的答案 实际上,在保存之前,我使用Breeze的
BeforeSaveEntities
委托执行了一些验证。问题是,如果您在这些验证期间从DBContext
检索实体,并且同一实体稍后将作为提交给Breeze controller的JObject
的一部分保存,则会遇到问题
我使用的解决方法是将这些验证作为
AfterSaveEntities
钩子执行,并告诉Breeze使用事务。另一种解决方法是使用不同的DB上下文在BeforeSaveEntities
部分中进行查询。这就是我正在做的,它工作得很好!事实上,我最后也这么做了。由于我的服务器也必须修改对象,所以我使用了两种不同的上下文:一个新实例用于读取实体进行验证,另一个由ContextProvider提供的实例用于更改正在修改的实体的某些属性。唯一的问题是,您应该设置第二个DB上下文以不跟踪实体。
{
"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": {}
}