【问题标题】:.NET 5.0 - EF - DbSet is empty after upgrade from 3.1.NET 5.0 - EF - 从 3.1 升级后 DbSet 为空
【发布时间】:2021-08-17 10:15:04
【问题描述】:

我的一个 DbSet 返回一个空列表,虽然数据存在于 db 中,并且在升级到 .NET 5.0 之前它曾经工作过

var list = await context.TeamMembers.ToListAsync(); >> returns empty list
var list = await context.TeamMembers.Include(t=>t.User).ToListAsync(); >> returns empty list

当其他人正常工作时返回填充列表

var list2 = await context.Users.ToListAsync(); >> works fine

我的数据库集是这样定义的

public DbSet<User> Users { get; set; }
public DbSet<TeamMember> TeamMembers { get; set; }

这是我的表结构

CREATE TABLE [dbo].[teamMembers] ( 
    [Id] INT IDENTITY (1, 1)  NOT NULL PRIMARY KEY, 
    [UserId] INT NOT NULL,
    [PartnerId] INT NOT NULL,
    [Type] INT NOT NULL,
    [CreationDate]       DATETIME    DEFAULT (getdate()) NOT NULL,
    [ModificationUserId] INT         NOT NULL,
    [ModificationDate]   DATETIME    DEFAULT (getdate()) NOT NULL,
    CONSTRAINT [FK_teamMembers_Members] FOREIGN KEY ([UserId]) REFERENCES [users]([Id]), 
    CONSTRAINT [FK_teamMembers_Partners] FOREIGN KEY ([PartnerId]) REFERENCES [partners]([Id]), 
    CONSTRAINT [FK_teamMembers_ModificationUser] FOREIGN KEY ([ModificationUserId]) REFERENCES [users]([Id]),
);

这是我的对象

[Table("teamMembers")]
public class TeamMember
{
    [Required]
    public int? Id { get; set; }

    [Required]
    public User User { get; set; }

    [Required]
    public int? PartnerId { get; set; }

    [Required]
    public int Type { get; set; } // 0 agency 1 Salesman

    [Required]
    public DateTime CreationDate { get; set; }
    [Required]
    public DateTime ModificationDate { get; set; }
    [Required]
    public int ModificationUserId { get; set; }
}

[编辑] 这是EF生成的查询,如果我手动运行它会返回数据 (我使用 .Include(...) 时有一个关节)

SELECT [t].[Id], [t].[CreationDate], [t].[ModificationDate], [t].[ModificationUserId], [t].[PartnerId], [t].[Type], [t].[UserId], [u].[Id], [u].[Civility], [u].[CreationDate], [u].[CreationUserId], [u].[Email], [u].[FirstName], [u].[Identifier], [u].[Language], [u].[LastName], [u].[Login], [u].[LoginEnabled], [u].[Mobile], [u].[ModificationDate], [u].[ModificationUserId], [u].[MustResetPassword], [u].[Password], [u].[Phone], [u].[Position], [u].[ResetPasswordDate], [u].[ResetPasswordToken], [u].[RoleId], [u].[Type]
FROM [teamMembers] AS [t]
LEFT JOIN [users] AS [u] ON [t].[UserId] = [u].[Id]

这里是用户类

public class User
{
    [Required]
    public int? Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public string Email { get; set; }

    public string Login { get; set; }

    [Required]
    public DateTime CreationDate { get; set; }

    [Required]
    public DateTime ModificationDate { get; set; }

    [Required]
    public int CreationUserId { get; set; }

    [Required]
    public int ModificationUserId { get; set; }

    [Required]
    public short RoleId { get; set; }

    [Required]
    public short Civility { get; set; }

    public string Phone { get; set; }

    public string Mobile { get; set; }

    [Required]
    public string Position { get; set; }

    [Required]
    public short Language { get; set; }

    [Required]
    public bool MustResetPassword { get; set; }
        
    [Required]
    public short Type { get; set; } // professional/private
        
    public string Identifier { get; set; }

    [JsonIgnore]
    public string Password { get; set; }
    [Column(TypeName = "BIT")]
    public bool LoginEnabled { get; set; }
    public string ResetPasswordToken { get; set; }
    public DateTime? ResetPasswordDate { get; set; }
}

这里是伙伴类

public class Partner
{
    [Required]
    public int? Id { get; set; }

    public Company Company { get; set; }
    [Required]
    public User Manager { get; set; }

    public List<Invoice> Invoices { get; set; }

    [NotMapped]
    public double InvoicesAmount { get; set; }

    [Required]
    public List<ProductRetribution> ProductsRetributions { get; set; }

    [Required]
    public double Won { get; set; }

    [Required]
    public double Pending { get; set; }

    [Required]
    public double Offset { get; set; }

    // following fields are created by the system, inputs from client are discarded, no validation , but needed for mvc
    [Required] 
    public DateTime CreationDate { get; set; }
    [Required] 
    public DateTime ModificationDate { get; set; }
    [Required] 
    public int ModificationUserId { get; set; }
}

我有什么遗漏吗?

感谢您的帮助

【问题讨论】:

  • SELECT * FROM [dbo].[teamMembers] 会给你结果吗?您可以检查 EF 针对您的数据库运行的原始 SQL 吗?您还有其他未在此处显示的实体配置吗?
  • 我在 db 中有数据,查询有效,并获取了其他实体......这曾经工作正常......我想到的唯一区别是我在 TeamMember 实体中有外键
  • 好的,这是我问的第一个问题,但还有两个...
  • 使用 sql profiler 我可以看到并重放 EF 创建的查询,它返回数据
  • 我没有其他配置...我不太明白你的意思

标签: entity-framework asp.net-core dbset


【解决方案1】:

事实证明,我检查了错误的数据库

实际数据库的表完全为空

故事的寓意:不要在开发服务器上混合 3 个版本的数据库

感谢大家帮助我,我一定会修复我的表中的所有可空值

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 2021-03-28
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2023-01-29
    • 2021-10-13
    • 1970-01-01
    • 2021-09-25
    相关资源
    最近更新 更多