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