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