4

Entity Framework 6 を実行している WCF サーバー アプリケーションがあります。

私のクライアント アプリケーションは、DataServiceContext を介してサーバーから OData を消費します。クライアント コードでは、コンテキストで HasChanges() メソッドを呼び出して、その中のデータが変更されたかどうかを確認できるようにしたいと考えています。

次の拡張メソッドを使用してみました。

    public static bool HasChanges(this  DataServiceContext ctx)
    {
        // Return true if any Entities or links have changes
        return ctx.Entities.Any(ed => ed.State != EntityStates.Unchanged) || ctx.Links.Any(ld => ld.State != EntityStates.Unchanged);
    }

ただし、追跡しているエンティティに変更がある場合でも、常に false を返します。

たとえば、Customer という名前の追跡エンティティがあるとすると、次のコードは常に SaveChanges() を呼び出す前に戻ります。

    Customer.Address1 = "Fred"
    if not ctx.HasChanges() then return
    ctx.UpdateObject(Customer)
    ctx.SaveChanges()

if not ctx.HasChanges() then returnコード行をコメントアウトすると、変更が正常に保存されるので、エンティティが変更を受け取り、保存できることを嬉しく思います。

私のコードからその事実を判断できないだけで、変更はコンテキストによって追跡されているようです。

DataServiceContext で HasChanges を特定する方法を教えてもらえますか?

4

4 に答える 4

2

エンティティを適切に追加/編集していない可能性はありますか? MSDNでは、クライアントで変更追跡を開始するには、、、またはを使用する必要があると述べています ( AddObjecthttps://msdn.microsoft.com/en-us/library/gg602811(v=vs.110).aspx UpdateObject-同時実行管理を参照) 。 . それ以外の場合は、拡張メソッドが適切に見えます。DeleteObject

于 2015-10-27T12:59:19.883 に答える
0

クライアントのデータコンテキストが同じではないので、変更は常にfalse.

Datacontextを変更するたびに、 が同じもの (インスタンス) であることを確認する必要がありますDatacontext。次に、変化を検出することは意味があります。

別の方法として、自分で変更を追跡する必要があります。単に追跡可能なエンティティを使用して、データ コンテキスト内のエンティティの変更を追跡するのに役立ちます。

ところで。コード「ctx.ChangeTracker.HasChanges()」を使用して、DataContext の変更を検出します。

    public bool IsContextDirty(DataServiceContext ctx)
    {
#if DEBUG
        var changed = ctx.ChangeTracker.Entries().Where(t => t.State != EntityState.Unchanged).ToList();
        changed.ForEach(
            (t) => Debug.WriteLine("entity Type:{0}", t.Entity.GetType()));
#endif
        return ctx != null && ctx.ChangeTracker.HasChanges();
    }
于 2015-10-29T05:49:35.163 に答える