この 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
を作成できます。Address
saveChanges()
プロパティを変更して同時にPerson
新しいものを追加しようとする場合を除いて、正常に動作します。Address
これは、JObject
Breeze 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 で実行しています。