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

时间:2017-11-07 11:35:24

标签: 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; }
}

在课堂上,我有:

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

1 个答案:

答案 0 :(得分:2)

它与implementation 'com.j256.ormlite:ormlite-core:5.0' implementation 'com.j256.ormlite:ormlite-android:5.0' / async无关。

密钥是await属性的[Key]属性。它告诉EF,user_id属性是表的PK,即唯一。因此,您的查询应返回0或1条记录。如果它返回更多(看起来如此),那么在实现期间,EF将使用相同的PK合并实体实例,从而产生具有同一个实体实例的列表,而不管查询结果如何。

查看实体,您很可能需要使用user_id的复合PK来标记它,目前只能使用流畅的API来完成。因此,请删除(user_id, item_id)属性并使用

[Key]