我创建了一个界面来尝试进行软删除,混合阴影属性和查询过滤器.但它不起作用.
public interface IDeletableEntity {}
Run Code Online (Sandbox Code Playgroud)
然后在我的模型构建器中
builder.Model.GetEntityTypes()
.Where(entityType => typeof(IDeletableEntity).IsAssignableFrom(entityType.ClrType))
.ToList()
.ForEach(entityType =>
{
builder.Entity(entityType.ClrType).Property<Boolean>("IsDeleted");
builder.Entity(entityType.ClrType).HasQueryFilter(e => EF.Property<Boolean>(e, "IsDeleted") == false);
});
Run Code Online (Sandbox Code Playgroud)
但是查询过滤器的行不能编译.我得到的错误是"无法将lambda表达式转换为'lambda表达式',因为它不是委托类型"
如果我这样做它就会起作用.
builder.Entity<MyEntity>().HasQueryFilter(m => EF.Property<Boolean>(m, "IsDeleted") == false);
Run Code Online (Sandbox Code Playgroud)
有什么方法可以做到这一点?这是为了在每个我想使用软删除实体的实体中都有一个IDeletableEntity接口而不必这样做
提前谢谢了,
我试图在EF Core 2.0中开展软删除行为.
public interface ISoftDeleteModel
{
bool IsDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
创建正确的列和软删除工作正常,但DbContext中的过滤实体不是.
我想在上下文中使用查询过滤,但我被卡住了.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
Type entityType;
// ^^^ it contains type of entity, eg. Blog, Post, etc. using
// modelBuilder.Model.GetEntityTypes().First().Name and converting to Type
var entity = modelBuilder.Entity(entityType);
if(entityType.GetInterface("ISoftDeleteModel") != null)
{
// ??? how to access IsDeleted property ???
entity.HasQueryFilter(x => !x.IsDeleted);
}
}
Run Code Online (Sandbox Code Playgroud)
问题很简单 - 如何访问IsDeleted属性?
如果我知道实体的类型,例如.Post和Post实现的ISoftDeleteModel我可以这样做:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>().HasQueryFilter(x => !x.IsDeleted);
}
Run Code Online (Sandbox Code Playgroud)
但我不知道这种类型.我试图实现简单的事情 - 所有实现此接口的模型都将被自动过滤.我错过了什么吗?
我正在尝试将过滤器应用于我的多租户查询,但它不允许我在属性是导航属性的一部分时应用过滤器:
modelBuilder.Entity<Level>().HasQueryFilter(lvl => lvl.SchoolYear.TenantId == _tenantProvider.TenantId);
Run Code Online (Sandbox Code Playgroud)
这里,Level是我想要过滤的属性,但TenantId用于过滤的属性在Level.SchoolYear中.
如果它是顶级房产,它可以正常工作.当我需要过滤的属性是导航属性时,如何应用全局过滤器?