私は次の汎用データアクセスクラスを持ち、データベース操作を担当しています。一般的なデータアクセスレイヤーでナビゲーションプロパティを更新する
internal sealed class DataStore<T> : IDataStore<T>
where T : BaseModel, new()
{
private readonly DataContext _context;
public DataStore(DataContext context)
{
this._context = context;
}
public async Task InsertNew(T obj)
{
await Task.Run(async() =>
{
_context.Set<T>().Add(obj);
await _context.SaveChangesAsync();
});
}
public async Task<T> SelectObj(int id, Expression<Func<T, object>> includeExpression = null)
{
if (includeExpression != null)
return
await _context.Set<T>()
.Include<T, object>(includeExpression)
.FirstOrDefaultAsync(x => x.ID.Equals(id));
return await _context.Set<T>().Where(x => x.ID.Equals(id)).FirstOrDefaultAsync();
}
public async Task<List<T>> SelectAll(Expression<Func<T, object>> includeExpression = null)
{
if (includeExpression != null)
return await _context.Set<T>().Include<T, object>(includeExpression).ToListAsync();
return await _context.Set<T>().ToListAsync();
}
public async Task Update(T obj)
{
await Task.Run(async() =>
{
var original = await SelectObj(obj.ID);
_context.Entry(original).CurrentValues.SetValues(obj);
await _context.SaveChangesAsync();
});
}
public async Task Delete(T obj)
{
await Task.Run(async() =>
{
_context.Set<T>().Remove(obj);
await _context.SaveChangesAsync();
});
}
public async Task Delete(int id, Expression<Func<T, object>> includeExpression = null)
{
await Task.Run(async() =>
{
var obj = await SelectObj(id, includeExpression);
await Delete(obj);
});
}
}
Update
機能の問題はそれだけで、そのオブジェクトのないナビゲーションプロパティ、通過したT
オブジェクトを更新し、です。
私は次のことを試しましたが、私は立ち往生しており、ここでどのように続行する必要があるかわかりません。
private void GetNavProperties(T obj)
{
var objType = obj.GetType();
foreach (var prop in objType.GetProperties())
{
if (prop.PropertyType.IsClass)
{
var values = prop.GetValue(obj);
//How do I go further here, setting the Entity on the context
}
}
}
を...何を更新します...最初にT objが最初にコンテキストから取り出されたのであれば、'content.SaveChangesAsync();を待っていました。 – Seabizkit