2013-04-08 3 views
0

Как выполнить логическое/мягкое удаление с помощью Breeze JS?Как выполнить логическое удаление с помощью Breeze JS?

Очевидно, что это будет зависеть от моей модели данных в том, как я реализую свое логическое удаление для меня (Status = 2), поэтому я бы обнаружил, что мой объект помечен для удаления в контроллере Breeze каким-то образом и преобразовал его в обновление с изменением моей колонки или какой предпочтительной практикой?

Это объясняет, как выполнить физическое удаление, на которое я верю, но не логическое удаление. http://www.breezejs.com/documentation/inside-entity#DeleteEntity

ответ

2

Ваше предложение, скорее всего, работать, но мой первый проход на это было бы просто добавить метод softDelete к клиентской стороне класса, который просто устанавливает статус 2. Я хотел бы также добавить условие каждого запроса на сервере, так что по умолчанию не deleted объекты не получить вернулся, что-то вроде «где Status = 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; 
    } 
} 

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