实体框架核心 (7):按 id 加载单个实体

本文关键字:实体 id 加载 单个 框架 核心 | 更新日期: 2023-09-27 18:37:27

.ToListAsync用于

从 EF Core 中的数据库获取项目集合。这很清楚。但是获得单件物品的正确方法是什么?如果可能,以异步方式。

public async static Task<Source> LoadEntityAsync(int sourceID)
{
    using (var db = new RPDBContext())
    {
        var sources =
            await
                db.Source
                    .Where(x => x.SourceID == sourceID)
                    .ToListAsync();
        // TODO that's like a hack:
        return sources.First();
    }
}

实体框架核心 (7):按 id 加载单个实体

如果您希望对象是唯一的,则应使用 SingleOrDefaultAsync。如果您知道该对象在域限制中是唯一的,或者您是通过主键访问它,则可以使用 FirstOrDefaultAsync

var sources = await db.Source
            .Where(x => x.SourceID == sourceID)
            .SingleOrDefaultAsync();

您可以使用另一个重载并缩短查询

var sources = await db.Source
            .SingleOrDefaultAsync(x => x.SourceID == sourceID);

同样的规则适用于FirstOrDefaultAsync

如果要确保对象存在,只需删除OrDefault部分并使用 SingleAsyncFirstAsync .

批准的答案是正确的,但从我的角度来看不是最好的。

如果按 id 进行搜索,请使用如下所示的 Find(PropertyID) 方法:

.db。Source.Find(SourceID)

哪里:

    数据库
  • :数据库上下文
  • 来源:您的实体类型
  • 源 ID 是主键

如果未找到,则返回对象或 null。更多详情请见:https://learn.microsoft.com/en-us/ef/ef6/querying/#:~:text=The%20Find%20method%20on%20DbSet,context%20or%20in%20the%20database。

如果需要检索单个项目,请使用FirstOrDefaultAsync

public static Task<Source> LoadEntityAsync(int sourceID)
{
    using (var db = new RPDBContext())
    {
        return db.Source.FirstOrDefaultAsync(x => x.SourceID == sourceID);
    }
}