3

この 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; }
}

APersonは多くの を持つことができますAddress

私は自分のアプリケーションに同時に管理できるページを持っていPersonますAddress。このページでは、1 回の Breeze呼び出しで複数のオブジェクトPersonを作成できます。AddresssaveChanges()

プロパティを変更して同時にPerson新しいものを追加しようとする場合を除いて、正常に動作します。Address

これは、JObjectBreeze Web API コントローラーが受け取る種類です。

{
  "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 は不平を言い、私の変更を受け入れることを拒否します。

オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。

何が起こっているのかわかりませんが、Breeze がこれらのエンティティを保存する方法により、Entity Framework 状態マネージャーでエンティティが重複するようです。

これを修正/回避する方法を知っている人はいますか? それは Breeze のバグですか、それとも私が正しく行っていないことですか?

ちなみに、私は Breeze 1.4.2 と Entity Framework 5.0.0 で実行しています。

4

1 に答える 1

3

私の問題に対する答えが見つかりました。

BeforeSaveEntities実際、Breeze のデリゲートを使用して、保存する前にいくつかの検証を実行していました。これらの検証中にエンティティを取得しDBContextていて、同じエンティティがJObjectBreeze コントローラに送信された一部として後で保存されている場合、問題が発生します。

私が使用する回避策は、代わりにこれらの検証をAfterSaveEntitiesフックとして実行し、Breeze にトランザクションを使用するように指示することです。

于 2013-10-01T21:07:37.410 に答える