1

さて、この投稿では、呼び出しごとのモードでサービスを操作する方が効率的であるという結論に達しました。これにより、呼び出すメソッドの寿命が短いデータ コンテキストが得られます。

この例では、要素のリストのデータを変更する方法を示しています。必要なのは、エンティティの状態を変更済みに設定することだけです。

ただし、たとえば、変更と更新などの 1 つの操作をどのように行うことができますか?

1つのケースはこれです。私には本と著者がいて、クライアント アプリケーションには、著者用と本用の 2 つのデータグリッドを持つビューがあります。ユーザーは、最初のデータグリッドで著者を追加して情報を変更し、2 番目のデータグリッドで書籍に対して同じことを行うことができます。本を著者に割り当てることもできます。

私は POCO クラスを持っているので、本のリストであるプロパティを持つ著者クラスを持っています。さて、このリストに書籍を追加できます。サービス メソッド updateAuthors を呼び出すと、author クラスをパラメーターとして使用するだけで済みます。EF は書籍の処理方法を認識しています。本も渡す必要はありません。

しかし、本のリストに新しい本と存在する本があり、その情報が変更されている場合はどうなるでしょうか?

最初に言及した投稿の例では、すべてのエンティティが変更されたときにそれを行う方法が示されていますが、新しいレジスタを追加する場合は、追加する状態を設定する必要があります。エンティティが混在している場合、どうすればよいのでしょうか? これを行うためのパターンまたは何らかの方法が存在しますか? すべての本の状態を設定する必要がありますか? 自動数字を ID として使用しているため、本の状態を知ることができます。ID が 0 の場合は新規登録、それ以外の場合は変更です。

ありがとう。ダイムロック。

編集:おそらく、私の質問はあまり明確ではありません。私が知りたいのは、一度に多くのエンティティの変更を保存する方法です。たとえば、Authors、Books、Custormers があります。それらの多くの情報を追加、変更、および削除します。私のWCFクライアントには、著者の変更を保存する方法、書籍の変更を保存する方法、および顧客の変更を保存する方法があります。

私のサービスは呼び出しごとにどのように機能するか、エンティティの種類ごとに 1 つずつ、合計 3 つの呼び出しを行う必要がありますが、これは独立しています。ただし、エンティティ フレームワークを直接使用すると、多くの種類のエンティティに多くの変更を加えることができ、savechanges を 1 回呼び出すだけですべての作業が完了します。WCF エンティティと POCO エンティティで同じことを行うにはどうすればよいですか?

私はセルフ トラッキング エンティティについて読んでいます。購入すると同じ問題が発生します。Applychanges(entity) を使用できますが、間違っていなければ、1 つのエンティティにのみ変更を適用します。多くのエンティティに変更を加えた場合、N 回呼び出す必要がありますか?

ありがとう。

4

2 に答える 2

1

これがあなたの質問に答えるかどうかはわかりませんが、ここに私の提案があります:

  • フラグ (IsNew、IsDirty、IsDeleted) を使用して POCO エンティティの状態を管理します。
  • POCO エンティティをオブジェクト コンテキストに渡すときは、ObjectStateManager を使用して、添付されたエンティティの状態を変更します。
  • 子エンティティのリストを再帰的にループし、同じアプローチを適用します。

編集: 次のコードは AuthorStateManager クラスです:

public partial class AuthorStateManager : IStateManager<Author, Context>
{

    private IStateManager<Book, Context> _BookStateManager = new BookStateManager();

    public void ChangeState(Author m, Context ctx)
    {
        if (m == null) return;
        ctx.Authors.Attach(m);
        if (m.IsDeleted)
        {
            ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Deleted);
        }
        else
        {
            if (m.IsNew)
            {
                ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Added);
            }
            else
            {
                if (m.IsDirty)
                {
                    ctx.ObjectStateManager.ChangeObjectState(m, System.Data.EntityState.Modified);
                }
            }
        }
        SetRelationsState(m, ctx);
    }

    private void SetRelationsState(Author m, Context ctx)
    {
        foreach (Book varBook in m.Books)
        {
            _BookStateManager.ChangeState(varBook, ctx);
        }
    }
}

Authors、はタイプのPOCO エンティティObjectSet、はオブジェクト コンテキスト、はすべての子状態マネージャーをループして状態を更新するメソッドです。mAuthorctxSetRelationsState

状態を変更した後、リポジトリ オブジェクトで を呼び出しますctx.SaveChanges()。これは AuthorRepository クラスの Update メソッドです。

public Author Update(Author m, bool commit)
{
    _AuthorStateManager.ChangeState(m, _ctx);
    if (commit)
    {
        _ctx.SaveChanges();
    }
    return m;
}

_BookStateManagerBookStateManager独自のChangeState()メソッドで Book 状態を変更する型のプライベート メンバーです。IStateManagerメソッドを持つというインターフェイスを State Manager クラスに実装させることをお勧めしますChangeState()

少し複雑に思えますが、これらのクラスのコードを生成すると簡単になります。

于 2012-05-04T10:42:51.673 に答える
1

1 回のサービス呼び出しで複数のアクションを実行する場合は、実行するアクションをメソッド呼び出しからオブジェクトに移行する必要があります。たとえば、Customer インスタンスが関連付けられている InsertCustomerAction クラスがあるとします。これらのすべてのアクションには基本クラス (Action) があり、WCF メソッドは Action インスタンスのコレクションを受け取ります。

于 2012-05-04T14:01:38.667 に答える