mysql - ToListAsync 将第一项的数据重复到每个列表项中

标签 mysql async-await entity-framework-core

我正在使用 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/

相关文章:

mysql - 将新行插入到连接到数据库上另一个表的表中

Mysql - 将所有表和列重命名为小写?

c# - IOCP 线程 - 澄清?

c# - 如何同时运行 2 个异步函数

.net - 如何使 VS2013 中的包管理器控制台可用(未禁用)?

c# - SQLite 不支持此迁移操作 ('DropForeignKeyOperation' )

php - 这段代码的性能很糟糕

mysql - 为什么我不能在 Xampp 中升级 MySQL?

c# - 来自异步序列化操作的 MissingMethodException

c# - 是否可以在 Entity Framework Core 中创建映射类?