我正在使用 EntityFrameworkCore
及其 async
方法对 MySql 数据库运行一些非常基本的 SQL。当使用 ToListAsync()
返回数据时,每一行都只是第一行的重复,即使行计数本身是正确的。
我的类定义为:
public class MyItem
{
[Key] public Guid user_id { get; set; }
public string item_id { get; set; }
public string folder { get; set; }
}
在类(class)本身中,我有:
using Microsoft.EntityFrameworkCore;
public class MyContext : DbContext
{
public virtual DbSet<MyItem> MyItems { get; set; }
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{}
...
并且查询本身以异步方法运行:
public async Task<MyReturnObject> GetMyReturnObject(string userId)
{
...
var sql = $"select user_id, item_id, folder from myItems where user_id = @p0";
var myItemList = await this.MyItems.FromSql(sql, userId).ToListAsync();
...
}
填充后立即检查 myItemList
会显示包含正确数量项目的行列表,但每个项目都是从第一行数据填充的。底层数据是不同的,并且我的混淆并未删除 SQL 中可能影响返回数据的任何联接。
我怀疑我误解了 async 和 wait 是如何与数据库查询一起使用的,但是我一直无法发现我的错误在哪里。
最佳答案
它与async
/await
无关。
键是 user_id
属性的 [Key]
属性。它告诉 EF user_id
属性是表的 PK,即唯一。因此您的查询预计会返回 0 或 1 条记录。如果它返回更多(看起来),那么在具体化过程中,EF 将合并具有相同 PK 的实体实例,从而生成一个包含一个且相同实体实例的列表,而不管查询结果如何。
查看实体,很可能您需要通过 (user_id, item_id)
使用复合 PK 来标记它,目前只能使用 Fluent API 来完成。因此,删除 [Key]
属性并使用
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// ...
modelBuilder.Entity<MyItem>().HasKey(e => new { e.user_id, e.item_id });
// ...
}
关于mysql - ToListAsync 将第一项的数据重复到每个列表项中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47156934/