Entity Framework Core/.NET Core 不会始终如一地返回结果

Posted

技术标签:

【中文标题】Entity Framework Core/.NET Core 不会始终如一地返回结果【英文标题】:Entity Framework Core/.NET Core does not consistently return results 【发布时间】:2022-01-09 22:46:55 【问题描述】:

我在一个名为 UserRepository 的类中有一个非常基本的方法。它应该返回一个具有给定 userId 的 User 对象。

public User GetUser(Guid userId)
    
        return _applicationDbContext.Users.Find(userId);
    

User 类/模型如下所示:

public class User

    public Guid UserId  get; set;  = Guid.NewGuid();
    public string EMail  get; set; 
    public string Name  get; set; 
    public string InstagramHandle  get; set; 

ApplicationDbContext 类如下所示:

public class ApplicationDbContext: DbContext
    
        public DbSet<User> Users  get; set; 
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        
        
    

Find(userId) 不会始终返回相应的用户对象。大多数情况下,它返回 null。有时,似乎只有当我放置断点并调试几分钟时,它才会返回正确的对象。调试的时候可以看到上下文的Users DbSet看起来刚刚好,userId看起来也刚刚好。两者都是 Guid,并且数据库/DbSet 中的 userId 绝对正确。

另一方面,这种方法就像一个魅力:

public IEnumerable<User> GetUsers()
    
        return _applicationDbContext.Users;
    

我试过 Find(),我试过 Where(),我试过 FirstAndDefault(),我试过 Single()。似乎没有什么能始终如一地工作。我对这个问题感到困惑,我从未见过这样的事情。

我还遇到了一个可能相关的不同问题,在尝试添加具有 userId 外键的对象时,我收到“无法添加或更新子行:外键约束失败”错误。只是提到它以防它有助于定位问题。

问题似乎出在 Guid 类型上。 ID 以 VARBINARY(16) 的形式存储在数据库中,但由于某种原因未正确映射到 C# Guid。但是我不知道如何解决这个问题。

【问题讨论】:

调用失败时执行的是什么SQL?您确定它连接到正确的数据库吗?您是否在调试输出中看到任何警告? "SELECT u.UserId, u.EMail, u.InstagramHandle, u.Name FROM Users AS u.UserId = @__get_Item_0 限制 1"。数据库正确,GetUsers() 完美运行。我没有看到任何警告。 【参考方案1】:

我想通了。我将尝试解释我认为我学到了什么。 LINQ 或实际从数据库中获取没有问题。问题是 .NET 无法将 Guid 从 mysql 正确转换为 C#。我通过在我的数据库连接字符串末尾添加GuidFormat=LittleEndianBinary16 来修复它,相当于oldGuids=true

【讨论】:

以上是关于Entity Framework Core/.NET Core 不会始终如一地返回结果的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Code-First(23):Entity Framework Power Tools

Entity Framework怎么GroupBY多个字段

entity framework 公共类

Entity Framework Fluent API

初步了解Entity Framework

Entity Framework 中的in操作实例