过滤所有查询(尝试实现软删除)
我试图在EF Core 2.0中开展软删除行为。
public interface ISoftDeleteModel { bool IsDeleted { get; set; } }
创建正确的列和软删除工作正常,但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); } }
问题很简单 – 如何访问IsDeleted属性?
如果我知道实体的类型,例如。 Post和Post实现的ISoftDeleteModel我可以这样做:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); }
但我不知道这种类型。 我试图实现简单的事情 – 实现此接口的所有模型都将自动过滤。 我错过了什么吗?
无法测试确切的API,但一般方法是创建约束generics方法并通过reflection调用它:
public static class EFFilterExtensions { public static void SetSoftDeleteFilter(this ModelBuilder modelBuilder, Type entityType) { SetSoftDeleteFilterMethod.MakeGenericMethod(entityType) .Invoke(null, new object[] { modelBuilder }); } static readonly MethodInfo SetSoftDeleteFilterMethod = typeof(EFFilterExtensions) .GetMethods(BindingFlags.Public | BindingFlags.Static) .Single(t => t.IsGenericMethod && t.Name == "SetSoftDeleteFilter"); public static void SetSoftDeleteFilter(this ModelBuilder modelBuilder) where TEntity : class, ISoftDeleteModel { modelBuilder.Entity ().HasQueryFilter(x => !x.IsDeleted); } }
现在你可以在你的OnModelCreating
使用这样的东西了:
foreach (var type in modelBuilder.Model.GetEntityTypes()) { if (typeof(ISoftDeleteModel).IsAssignableFrom(type.ClrType)) modelBuilder.SetSoftDeleteFilter(type.ClrType); }
- 在dotnet核心中读取json文件时出错“已达到inotify实例数量的已配置用户限制(128)”
- 是否真的需要.net core 2 API中的services.AddSingleton
- 如何从.Net核心应用程序中的SQL语句获取标量值?
- .NET Core(或ASP.NET 5)中是否有MEF的替代品
- 如何从.net核心中的appsettings.json中提取列表
- VS.NET 2017强制在ASP.NET 2.0 Core应用程序中使用StackExchange.Redis 1.2.4.0
- 将global.asax迁移到ASP.NET 5
- 如何从Entity Framework Core中的DbContext获取列名和相应的数据库类型
- 如何在.NET Core中使用HttpClientHandler和HttpClientFactory