0

ObjectContext を持つオブジェクトがあります。そのオブジェクトの OnSave 次のように、その ObjectContext を使用してアクションを実行しています。

public void SaveChangesAction(ObjectContext context)
        {
            // Validate the state of each entity in the context
            // before SaveChanges can succeed.
            foreach (ObjectStateEntry entry in
                context.ObjectStateManager.GetObjectStateEntries(
                EntityState.Added | EntityState.Modified))
            {
                var type = entry.Entity.GetType();
                var RepoBase = typeof(RepositoryBase<myEntityFrameworkObject>);
                MethodInfo mi = RepoBase.GetMethod("GenerateLog");
                MethodInfo constructed = mi.MakeGenericMethod(type);

                constructed.Invoke(this, new object[] { entry.Entity });
            }
        }

「GenerateLog」メソッド内で、Entity を取得し、ObjectContext から切り離します (これにより、すべての Lazy Loaded オブジェクトを通過することなく Binary Object に変換できます)。

バイナリ オブジェクトに変換した後、バイナリ データを保持する (別のタイプの) 別のオブジェクトを作成します。私は電話しますthis.ObjectContext.AddObject('TableName', myNewObject);

次に、以前にデタッチしたオブジェクトでこれを呼び出します (entityState はエンティティの以前の状態です)。

if (entity.EntityState != entityState)
{
    this.ObjectContext.AddObject(entity.GetType().Name, entity);
}

この時点で、コードは上記の SaveChangesAction メソッドに戻ります。現在、これらのオブジェクトはどちらも ObjectContext にないため、どちらもデータベースに保存されません。
オブジェクトに影響を与える ForEach 内のオブジェクトを変更することで、すでに何か悪いことをしていることは理解していますが、これが ObjectContext が保存される直前に実行する必要があるコードであることを考えると、他にこれを行う方法がわかりません。

4

1 に答える 1

1

いくつかのポイント:

  • その反射はにおいがします。あなたはあなたが持っているリポジトリを知っているので、ルックアップ値としてタイプを使って辞書を作るだけです。
  • どうしてあなたのコードが実行される可能性があるのだろうか。ループ内のエンティティをデタッチすると、反復コレクションが変更され、例外がスローされます。ToArrayこれは、を呼び出すかToList、状態マネージャーのクエリで回避できます。
  • 追加および変更されたエンティティを繰り返してそれらを切り離しますが、その後は常にエンティティを新しいものとして追加するため、古いエンティティを更新する代わりに、重複を挿入しようとしています
  • オブジェクトを切り離すと、すべての関係が壊れます。このアクションによってリレーションの一部の変更が失われ、オブジェクトをコンテキストに追加またはアタッチして、それらが再作成されないことはほぼ確実です。
  • このメソッドはObjectContextパラメーターを取りますが、他のコードスニペットが使用しthis.ObjectContextているため、これらの部分がそれら自体とどのように関連しているかは完全には明確ではありません。
  • context.SaveChangesの場所で呼び出さないと、変更が保存されないのはそのためではありません。
于 2011-05-28T10:03:09.080 に答える