我正在使用带有 Entity Framework Core 的 ASP.net MVC 核心创建一个 Web API。我正在使用 NSwag 来使用 swagger 文档和 Swagger UI,我正在测试 Post 方法并且它们有效,但 get 返回空或 null。在这里可以看到数据库中的数据获取表的所有数据的代码是这样的: // GET: api/UserRoles [HttpGet] public IEnumerable<UserRole> GetUserRoles() { return _context.UserRoles.ToList(); }但即使数据库中有数据,它也返回 null,并且所有其他查询返回 null 或空(或在以下情况下抛出异常.First()这是我的OnModelCreatingprotected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //Debugger.Launch(); modelBuilder.Entity<Category>().HasOne(x => x.ParentCategory).WithMany(x => x.SubCategories).HasForeignKey(x => x.ParentCategoryId); foreach (var entity in modelBuilder.Model.GetEntityTypes()) { var type = entity.ClrType.GetInterface(nameof(Interfaces.IDto)); if (type == null) continue; modelBuilder.Entity(entity.ClrType).Property<DateTime?>("DeletedAt"); modelBuilder.Entity(entity.ClrType) .Property<DateTime>("LastUpdated") .HasComputedColumnSql("SYSUTCDATETIME()"); modelBuilder.Entity(entity.ClrType) .Property<DateTime>("CreatedAt").HasDefaultValueSql("SYSUTCDATETIME()"); ; modelBuilder.Entity(entity.ClrType) .HasKey(nameof(Interfaces.IDto.Id)).ForSqlServerIsClustered(false); modelBuilder.Entity(entity.ClrType) .HasIndex("CreatedAt").ForSqlServerIsClustered(); var parameter = Expression.Parameter(entity.ClrType, "e"); var body = Expression.NotEqual( Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(DateTime?) }, parameter, Expression.Constant("DeletedAt")), Expression.Constant(null)); modelBuilder.Entity(entity.ClrType).HasQueryFilter(Expression.Lambda(body, parameter)); } modelBuilder.Entity<Customer>().HasIndex(x => x.Identification).IsUnique(); }
2 回答
幕布斯6054654
TA贡献1876条经验 获得超7个赞
问题在Expression.NotEqual这里:
var parameter = Expression.Parameter(entity.ClrType, "e");
var body = Expression.NotEqual(
Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(DateTime?) }, parameter, Expression.Constant("DeletedAt")),
Expression.Constant(null));
modelBuilder.Entity(entity.ClrType).HasQueryFilter(Expression.Lambda(body, parameter));
当前所做的是设置一个类似于此(伪代码)的全局查询过滤器(即应用于所有查询的附加条件):
e => e.DeletedAt != null
这将返回所有软删除记录(在你的情况下没有),而我想这个想法是返回非软删除记录,即
e => e.DeletedAt == null
所以只需更改Expression.NotEqual为Expression.Equal,问题就会得到解决。
慕码人2483693
TA贡献1860条经验 获得超9个赞
您需要创建一个查询以从您的上下文中获取特定信息。
使用上下文创建对表的查询。
例如。
var query = context.Students .where(s => s.StudentName == "Bill") .FirstOrDefault<Student>();
查询.tolist()
- 2 回答
- 0 关注
- 94 浏览
添加回答
举报
0/150
提交
取消