Breeze服务器端:更改EntityState以启用软删除

Breeze服务器端:更改EntityState以启用软删除,breeze,Breeze,我想在我的数据库中进行软删除。我将通过将IsDeleted值设置为true来标记删除,从而处理对数据库的删除。相应地,我希望Breeze查询排除设置了IsDeleted标志的行 我更喜欢在服务器端而不是在客户端执行此操作 我可以在自定义上下文提供程序中截取删除并设置IsDeleted属性。我想设置entityInfo.EntityState=EntityState.Modified并继续更新。但是,entityInfo.EntityState似乎是只读的 是否有其他方法来完成此任务?您可以使用E

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

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

我可以在自定义上下文提供程序中截取删除并设置IsDeleted属性。我想设置entityInfo.EntityState=EntityState.Modified并继续更新。但是,entityInfo.EntityState似乎是只读的

是否有其他方法来完成此任务?

您可以使用EntityAspect.setModified、setDeleted和setUnchanged方法来完成此任务。i、 e

myEntity.entityAspect.setModified();
可以使用EntityAspect.setModified、setDeleted和setUnchanged方法来完成此操作。i、 e

myEntity.entityAspect.setModified();

您可以覆盖BeforeSaveEntities()。删除具有EntityState.Deleted的条目,然后使用EntityState.Modified再次添加它们。您需要breeze版本1.3.3。

您可以覆盖BeforeSaveEntities()。删除具有EntityState.Deleted的条目,然后使用EntityState.Modified再次添加它们。您将需要breeze v 1.3.3。

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

按照我使用“ExclutionDate”属性时使用的非常简单的方式:

// 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;
    }
}

// -------------------------------------------
//模型-----------------------------------
公共接口ISoftDelete
{
日期时间?排除日期{get;set;}
}
公共秩序:ISoftDelete
{
//道具。。。
公共日期时间?排除日期{get;set;}
}
// ------------------------------------------
//资料-------------------------------------
公共接口IBreezeRepository
{
IQueryable All();
}
公共类软件存储库:
IBreezeRepository,其中T:class,ISoftDelete
{
公共软存储库(DbContext)
{
上下文=上下文;
}
受保护的DbContext上下文{get;private set;}
公共IQueryable All()
{
返回Context.Set().Where(p=>!p.ExclutionDate.HasValue);
}
}
公营单位
{
私有只读EFContextProvider\u contextProvider;
公共工作单元()
{
_contextProvider=新的EFContextProvider
{
BeforeSaveEntityDelegate=BeforeSaveEntity
};
var context=_contextProvider.context;
订单=新的软件存储库(上下文);
}
公共IBreeZerespository命令{get;private set;}
私有bool BeforeSaveEntity(EntityInfo EntityInfo)
{
var entityType=entityInfo.Entity.GetType();
//一点反射魔法
if(typeof(ISoftDelete).IsAssignableFrom(entityType)&&
entityInfo.EntityState==EntityState.Deleted)
{
entityInfo.GetType().GetProperty(“EntityState”)
.SetValue(entityInfo,EntityState.Modified,null);
var实体=实体信息。实体为ISoftDelete;
如果(实体!=null)
{
entity.ExclutionDate=DateTime.Now;
entityInfo.ForceUpdate=true;
}
}
返回true;
}
}
// -------------------------------------------

请参阅:

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

按照我使用“ExclutionDate”属性时使用的非常简单的方式:

// 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;
    }
}

// -------------------------------------------
//模型-----------------------------------
公共接口ISoftDelete
{
日期时间?排除日期{get;set;}
}
公共秩序:ISoftDelete
{
//道具。。。
公共日期时间?排除日期{get;set;}
}
// ------------------------------------------
//资料-------------------------------------
公共接口IBreezeRepository
{
IQueryable All();
}
公共类软件存储库:
IBreezeRepository,其中T:class,ISoftDelete
{
公共软存储库(DbContext)
{
上下文=上下文;
}
受保护的DbContext上下文{get;private set;}
公共IQueryable All()
{
返回Context.Set().Where(p=>!p.ExclutionDate.HasValue);
}
}
公营单位
{
私有只读EFContextProvider\u contextProvider;
公共工作单元()
{
_contextProvider=新的EFContextProvider
{
BeforeSaveEntityDelegate=BeforeSaveEntity
};
var context=_contextProvider.context;
订单=新的软件存储库(上下文);
}
公共IBreeZerespository命令{get;private set;}
私有bool BeforeSaveEntity(EntityInfo EntityInfo)
{
var entityType=entityInfo.Entity.GetType();
//一点反射魔法
if(typeof(ISoftDelete).IsAssignableFrom(entityType)&&
entityInfo.EntityState==EntityState.Deleted)
{
entityInfo.GetType().GetProperty(“EntityState”)
.SetValue(entityInfo,EntityState.Modified,null);
var实体=实体信息。实体为ISoftDelete;
如果(实体!=null)
{
entity.ExclutionDate=DateTime.Now;
entityInfo.ForceUpdate=true;
}
}
返回true;
}
}
// -------------------------------------------

请参阅:

我想我可能已经找到了一种使用实体框架实现服务器端的好方法

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

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


如果您先使用代码,也许这也能帮助您做到这一点:

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

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

然后在