繁体   English   中英

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

[英]How to perform logical delete with Breeze JS?

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

显然,对于我(状态= 2),我将如何实现逻辑删除,这将取决于我的数据模型,因此我会检测到我的实体在Breeze控制器中被标记为删除,并将其转换为更新我的列更改或者首选做法是什么?

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

您的建议可能会有效,但我的第一个通道就是向您的客户端类添加一个softDelete方法,只需将状态设置为2 我还会在服务器上的每个查询中添加一个'where Status!= 2'条件,这样默认情况下不会返回任何deleted实体,例如:

[HttpGet]
public IQueryable<Customer> Customers(bool includedDeleted) {
   if (includeDeleted) {
     return ContextProvider.Context.Customers;
   } else {
     return ContextProvider.Context.Customers.Where(c = c.Status != 2);
   }
} 

进一步的改进是在SaveChanges调用之后自动分离客户端上的任何soft deleted实体。 即迭代“已保存”的实体并以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;
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM