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?您确定它连接到正确的数据库吗?您是否在调试输出中看到任何警告? "SELECTu
.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