相关疑难解决方法(0)

EF Core:使用阴影属性和查询过滤器进行软删除

我创建了一个界面来尝试进行软删除,混合阴影属性和查询过滤器.但它不起作用.

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接口而不必这样做

提前谢谢了,

c# entity-framework ef-core-2.0

9
推荐指数
2
解决办法
1491
查看次数

过滤所有查询(尝试实现软删除)

我试图在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)

但我不知道这种类型.我试图实现简单的事情 - 所有实现此接口的模型都将被自动过滤.我错过了什么吗?

c# entity-framework entity-framework-core .net-core

6
推荐指数
1
解决办法
2457
查看次数

在导航属性上使用EF Core HasQueryFilter

我正在尝试将过滤器应用于我的多租户查询,但它不允许我在属性是导航属性的一部分时应用过滤器:

modelBuilder.Entity<Level>().HasQueryFilter(lvl => lvl.SchoolYear.TenantId == _tenantProvider.TenantId);
Run Code Online (Sandbox Code Playgroud)

这里,Level是我想要过滤的属性,但TenantId用于过滤的属性在Level.SchoolYear中.

如果它是顶级房产,它可以正常工作.当我需要过滤的属性是导航属性时,如何应用全局过滤器?

c# entity-framework-core asp.net-core

4
推荐指数
2
解决办法
1534
查看次数