【发布时间】: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.NameFROMUsersASu.UserId= @__get_Item_0 限制 1"。数据库正确,GetUsers() 完美运行。我没有看到任何警告。
标签: mysql linq .net-core entity-framework-core