对数据库的查询返回空或null,但是保存数据确实有效

时间:2019-03-30 23:38:29

标签: c# sql-server asp.net-core entity-framework-core

我正在使用ASP.net MVC核心和Entity Framework Core创建一个Web API。我正在使用NSwag使用swagger文档和Swagger UI,在那里我正在测试Post方法,它们可以工作,但是get返回为空或null。

在这里您可以查看数据库中的数据

enter image description here

获取表的所有数据的代码是这样的:

 // GET: api/UserRoles
        [HttpGet]
        public IEnumerable<UserRole> GetUserRoles()
        {
            return _context.UserRoles.ToList();
        }

,但是即使数据库中有数据,它也返回null,并且所有其他查询返回null或为空(或者在.First()情况下抛出异常

这是我的OnModelCreating

protected 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();
    }

这是我的UserRole模型

public class UserRole:Dbo
{
    public string Name { set; get; }
    public string Description { get; set; }
}

这是我的Dbo

public abstract class Dto : IDto, INotifyPropertyChanged
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

所有查询的所有模型均返回null或为空

更新:

在这里您可以看到正在调用Where()的方法,结果为0(我只有一条记录,其中name等于“ admin”),还可以看到查询{{1} }查询表并返回0条记录。

enter image description here

2 个答案:

答案 0 :(得分:4)

问题出在这里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));

当前要做的是设置类似于以下内容(伪代码)的global query filter(即应用于所有查询的附加条件):

e => e.DeletedAt != null

它将返回所有软删除的记录(在您的情况下为空),而我想这个想法是返回非软删除的记录,即

e => e.DeletedAt == null

因此只需将Expression.NotEqual更改为Expression.Equal即可解决问题。

答案 1 :(得分:0)

您需要创建查询以从您的上下文中获取特定信息。

使用上下文创建对表的查询。

例如。

var query = context.Students
                   .where(s => s.StudentName == "Bill")
                   .FirstOrDefault<Student>();

query.tolist()