1

我想在我的数据库中进行软删除。我将通过将 IsDeleted 值设置为 true 来标记删除来处理对数据库的删除。相应地,我希望 Breeze 查询排除设置了 IsDeleted 标志的行。

我更喜欢在服务器端而不是在客户端执行此操作。

我可以在自定义 Breeze EFContextProvider 中拦截删除并设置 IsDeleted 属性。我想设置 entityInfo.EntityState = EntityState.Modified 并继续更新。但是,entityInfo.EntityState 似乎是只读的。

有没有其他方法可以做到这一点?

4

4 回答 4

1

我想我可能已经找到了一种使用 Entity Framework 进行服务器端的好方法。

您需要为表中的特定行创建一个将 IsDeleted 设置为 true 的存储过程。

然后在您的 edmx 文件中,转到您的实体的映射详细信息,然后选择将实体映射到函数。单击并提供您的 SP。

如果您首先使用代码,也许这可以帮助您做同样的事情:https ://msdn.microsoft.com/en-us/data/dn468673.aspx

于 2016-05-06T21:00:14.570 回答
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;
    }
}

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

请参阅:如何使用 Breeze JS 执行逻辑删除?

于 2014-03-28T21:27:39.153 回答
0

您可以覆盖 BeforeSaveEntities()。从地图中删除带有 EntityState.Deleted 的条目,然后使用 EntityState.Modified 再次添加它们。您将需要微风 v 1.3.3。

于 2013-05-24T08:19:25.047 回答
0

您可以使用EntityAspect.setModifiedsetDeletedsetUnchanged方法来完成此操作。IE

myEntity.entityAspect.setModified();
于 2013-05-23T22:24:38.907 回答