2013-04-08 53 views
0

如何使用Breeze JS执行逻辑/软删除?如何使用Breeze JS执行逻辑删除?

显然它取决于我的数据模型,我如何实现我的逻辑删除,对我来说(状态= 2),所以我会检测到我的实体被标记为在Breeze控制器中以某种方式删除并将其转换为更新随着我的专栏改变,或者首选的做法是什么?

这解释了如何执行物理删除我相信,但没有逻辑删除。 http://www.breezejs.com/documentation/inside-entity#DeleteEntity

回答

2

你的建议可能会工作,但我在这第一关,简直是一个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

希望这是有道理的。

0

它目前的一种工作方式,不是很优雅,因为它使用反射,但比没有解决方案更好。

遵循我使用“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; 
    } 
} 

// -------------------------------------------