【问题标题】:ToListAsync repeating first item's data into every list itemToListAsync 将第一项的数据重复到每个列表项中
【发布时间】:2018-04-19 19:06:11
【问题描述】:

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

在课堂上,我有:

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 和 await 是如何用于数据库查询的,但是我一直无法发现我的错误在哪里。

【问题讨论】:

  • 你真的需要传入原始 SQL 吗?这首先否定了拥有 ORM 的许多好处。相反,只需执行MyItems.Where(x =&gt; x.user_id == userId) 您如何使用此方法的结果?你确定你在那里正确使用它吗?
  • @DavidG 这是一个很好的观点。它使某些部分(我省略了)更容易,但如果涉及“工作”与“更容易”,那么“工作”显然会胜出。
  • @DavidG 在调试模式下(在此 FromSql 行之后立即有一个断点)和在它返回数据的 UI 中都显示了不正确的值,所以我对我有信心看到。
  • MySQL 很少需要“异步”。
  • 正如@IvanStoev 所说,您的模型不正确。根据您在上面发布的内容,将只有 0/1 记录而不是多次重复。

标签: mysql async-await entity-framework-core


【解决方案1】:

async / await 无关。

关键是user_id 属性的[Key] 属性。它告诉 EF user_id 属性是表的 PK,即是 unique。因此,您的查询预计将返回 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 });
    // ...
}

【讨论】:

  • 啊!很好,感谢您提出使用复合 PK 的建议。
猜你喜欢
  • 2014-08-09
  • 2021-12-22
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多