私は現在、そのように単一のテーブルのみを更新できる一般的なリポジトリクラスを使用しています
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.) そのような条件がなく、すべての子行をすべての行に対して同じ値で更新する必要がある場合、どのような変更を行う必要がありますか?
お時間を割いていただきありがとうございます。皆様のエントリーをお待ちしております...