【发布时间】: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 => x.user_id == userId)您如何使用此方法的结果?你确定你在那里正确使用它吗? -
@DavidG 这是一个很好的观点。它使某些部分(我省略了)更容易,但如果涉及“工作”与“更容易”,那么“工作”显然会胜出。
-
@DavidG 在调试模式下(在此
FromSql行之后立即有一个断点)和在它返回数据的 UI 中都显示了不正确的值,所以我对我有信心看到。 -
MySQL 很少需要“异步”。
-
正如@IvanStoev 所说,您的模型不正确。根据您在上面发布的内容,将只有 0/1 记录而不是多次重复。
标签: mysql async-await entity-framework-core