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

时间:2013-09-26 14:40:19

标签: 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<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。在此页面中,我可以在一次微风Person电话中创建Address和多个saveChanges()

它工作正常,除非我尝试修改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无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。

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

有没有人知道如何修复/解决这个问题?这是Breeze中的一个错误,还是我做错了?

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

1 个答案:

答案 0 :(得分:3)

我找到了问题的答案。

实际上,我在保存前使用Breeze的BeforeSaveEntities代表进行了一些验证。事情是,如果您在这些验证期间从DBContext检索实体,并且稍后将同一实体保存为提交给Breeze控制器的JObject的一部分,则会遇到问题。

我使用的解决方法是以AfterSaveEntities挂钩的方式执行这些验证,并告诉Breeze使用事务。