2

私は現在、そのように単一のテーブルのみを更新できる一般的なリポジトリクラスを使用しています

public abstract class MyRepository<T> : IRepository<T>
        where T : class
{


    protected IObjectSet<T> _objectSet;
    protected ObjectContext _context;

    public MyRepository(ObjectContext Context)
    {
        _objectSet = Context.CreateObjectSet<T>();
        _context = Context;
    }


    public IQueryable<T> GetAll()
    {
        return _objectSet.AsQueryable();
    }

    public IQueryable<T> Find(Expression<Func<T, bool>> filter)
    {
        return _objectSet.Where(filter);
    }

    public void Add(T entity)
    {
        _objectSet.AddObject(entity);
        _context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Added);
        _context.SaveChanges();
    }

    public void Update(T entity)
    {
        _context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
        _context.SaveChanges();
    }

    public void Delete(T entity)
    {
        _objectSet.Attach(entity);
        _context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Deleted);
        _objectSet.DeleteObject(entity);
        _context.SaveChanges();
    }

}

EDMX デザイナーによって生成されたテーブル クラスごとに、このような別のクラスを作成します。

public class CustomerRepo : MyRepository<Customer>
{
    public CustomerRepo (ObjectContext context)
        : base(context)
    {

    }
}

特定のテーブルを更新する必要がある場合は、次のようにします。

Customer CustomerObj = new Customer();
CustomerObj.Prop1 = ...
CustomerObj.Prop2 = ...
CustomerObj.Prop3 = ...
CustomerRepo.Update(CustomerObj);

これは、Customer という特定のテーブルだけを更新する場合に完全に機能します。Orders という Customer の子である別のテーブルの各行も更新する必要がある場合、クラス MyRepository にどのような変更を加える必要がありますか。Orders テーブルには、Customer レコードの複数のレコードと、Field1、Field2、Field3 などの複数のフィールドも含まれます。

だから私の質問は: 1.) 条件に基づいて一部の行の Orders テーブルの Field1 を更新し、別の条件に基づいて他の行の Field2 のみを更新する必要がある場合、どのような変更を行う必要がありますか?

2.) そのような条件がなく、すべての子行をすべての行に対して同じ値で更新する必要がある場合、どのような変更を行う必要がありますか?

お時間を割いていただきありがとうございます。皆様のエントリーをお待ちしております...

4

1 に答える 1

1

var myCustomer = new Customer()主な問題は、切断されたエンティティ(つまり)をデータコンテキストにアタッチせずに更新しようとしていることです。切断されたエンティティをアタッチする方法の詳細については、この回答を参照してください。あなたの場合、親エンティティだけでなく、すべての子エンティティもアタッチする必要があるため、これは複雑になる可能性があると思います。

私の提案は、あなたの場合、最初にコンテキストから取得されたエンティティに対して更新を実行することです。したがって、すでにコンテキストにアタッチされています。この場合、これらのエンティティは変更自体を追跡します。エンティティをコンテキストにアタッチしたり、を呼び出したりする必要はありません_context.ObjectStateManager.ChangeObjectState。繰り返しになりますが、アタッチされたエンティティの更新を実行する例については、前述したのと同じ回答を見てください。親オブジェクトがロードされたら、そのオブジェクトとその子に変更を適用し、すべてが完了したら、SaveChangesコンテキストでメソッドを呼び出します。

注:デフォルトでは、EFはすべての子関係(つまり、子オブジェクト、コレクションなど)を遅延ロードします。ただし、場合によっては、遅延読み込みではなく、親が読み込まれると同時に子オブジェクトを明示的に/熱心に読み込むことができます(ドキュメントはこちらにあります)。

于 2012-06-26T13:41:00.820 に答える