如何使用Breeze JS执行逻辑/软删除?如何使用Breeze JS执行逻辑删除?
显然它取决于我的数据模型,我如何实现我的逻辑删除,对我来说(状态= 2),所以我会检测到我的实体被标记为在Breeze控制器中以某种方式删除并将其转换为更新随着我的专栏改变,或者首选的做法是什么?
这解释了如何执行物理删除我相信,但没有逻辑删除。 http://www.breezejs.com/documentation/inside-entity#DeleteEntity
如何使用Breeze JS执行逻辑/软删除?如何使用Breeze JS执行逻辑删除?
显然它取决于我的数据模型,我如何实现我的逻辑删除,对我来说(状态= 2),所以我会检测到我的实体被标记为在Breeze控制器中以某种方式删除并将其转换为更新随着我的专栏改变,或者首选的做法是什么?
这解释了如何执行物理删除我相信,但没有逻辑删除。 http://www.breezejs.com/documentation/inside-entity#DeleteEntity
你的建议可能会工作,但我在这第一关,简直是一个softDelete
方法添加到您的客户端类,简单地将状态设置为2
。我还要补充一个条件,服务器上的每个查询,以便在默认情况下没有deleted
实体得到恢复,像“其中状态= 2!”:
[HttpGet]
public IQueryable<Customer> Customers(bool includedDeleted) {
if (includeDeleted) {
return ContextProvider.Context.Customers;
} else {
return ContextProvider.Context.Customers.Where(c = c.Status != 2);
}
}
进一步的细化将自动断开任何soft deleted
实体在客户端拨打SaveChanges
后。即迭代“保存”的实体并将其与任何分开的任何分开status == 2
希望这是有道理的。
它目前的一种工作方式,不是很优雅,因为它使用反射,但比没有解决方案更好。
遵循我使用“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;
}
}
// -------------------------------------------