1

次のような自己参照エンティティを持つ自己参照テーブルがあります:( はい、IdFamilyはnull可能です)

...
//At my Business
newFile.Family = newFile;
...
//At my ASP.NET MVC action I call:
context.SaveChanges();

DbUpdateExceptionをスローします。

[UpdateException: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.]
   System.Data.Mapping.Update.Internal.UpdateTranslator.DependencyOrderingError(IEnumerable`1 remainder) +4302030
   System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +4300384
   System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) +583
   System.Data.Entity.Internal.InternalContext.SaveChanges() +382

[DbUpdateException: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.]
   System.Data.Entity.Internal.InternalContext.SaveChanges() +485
   System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +63
   System.Data.Entity.DbContext.SaveChanges() +75

SaveChangesを呼び出し、IDを設定して、もう一度SaveChangesを呼び出す必要があるため、回避策は醜いです。UnitOfWorkを壊しているので、回避策を回避するには、すべてのリクエストをTransactionScope内に配置する必要があります。

...
//At my Business
//newFile.Family = newFile;
context.SaveChanges();//BREAK UNIT OF WORK
newFile.IdFamily = newFile.Id;
...
//At my ASP.NET MVC action I call(Action Wrapped in TransactionScope):
context.SaveChanges();
4

1 に答える 1

1

ここでの問題は、単一のエンティティを保存するためにデータベースへの2回の書き込み(1つはストアで生成されたPKを取得するため、もう1つはそのPKをFKに保存するため)、または更新パイプラインとプロバイダーモデルがさらに生成する機能のいずれかを必要とすることです。これをすべてサーバー上で実行できる複雑なSQL。現在、更新パイプラインはこれらのいずれもサポートしていません。

回避策は、あなたが言うように、手動で二重保存を実行することです。

この特定の問題を追跡するバグはないと思うので、CodePlexに報告することをお勧めします。また、修正を提供することを検討することもできます。更新パイプラインコードに精通していないため、修正がどれほど難しいかはわかりません。

于 2013-02-25T18:21:59.177 に答える