現在の動作方法の 1 つは、リフレクションを使用するためあまりエレガントではありませんが、解決策がないよりはましです。
「ExclusionDate」プロパティを使用して使用する非常に単純化された方法に従います。
// Model -----------------------------------
public interface ISoftDelete
{
DateTime? ExclusionDate { get; set; }
}
public class Order : ISoftDelete
{
// Props...
public DateTime? ExclusionDate { get; set; }
}
// ------------------------------------------
// Data -------------------------------------
public interface IBreezeRepository<out T>
{
IQueryable<T> All();
}
public class SoftRepository<T> :
IBreezeRepository<T> where T : class, ISoftDelete
{
public SoftRepository(DbContext context)
{
Context = context;
}
protected DbContext Context { get; private set; }
public IQueryable<T> All()
{
return Context.Set<T>().Where(p=> !p.ExclusionDate.HasValue);
}
}
public class UnitOfWork
{
private readonly EFContextProvider<EcmContext> _contextProvider;
public UnitOfWork()
{
_contextProvider = new EFContextProvider<EcmContext>
{
BeforeSaveEntityDelegate = BeforeSaveEntity
};
var context = _contextProvider.Context;
Orders = new SoftRepository<Order>(context);
}
public IBreezeRepository<Order> Orders { get; private set; }
private bool BeforeSaveEntity(EntityInfo entityInfo)
{
var entityType = entityInfo.Entity.GetType();
// a little reflection magic
if (typeof(ISoftDelete).IsAssignableFrom(entityType) &&
entityInfo.EntityState == EntityState.Deleted)
{
entityInfo.GetType().GetProperty("EntityState")
.SetValue(entityInfo, EntityState.Modified, null);
var entity = entityInfo.Entity as ISoftDelete;
if (entity != null)
{
entity.ExclusionDate = DateTime.Now;
entityInfo.ForceUpdate = true;
}
}
return true;
}
}
// -------------------------------------------
参照: Breeze JS で論理削除を実行する方法