如何获取 DbSet 的主键?

Nic*_*ada 5 c# entity-framework-core .net-core

我将 Net Core 1.1 和 Entity Framework Core 与流畅的 API 一起使用。我正在为 DbSet 编写一个简单的扩展方法,以在控制台中显示其实体:

public static class DbSetExtension
{
    public static void Show<T>(this DbSet<T> set) where T:class
    {

        WriteLine();
        WriteLine($"Set: {typeof(T).Name} - {set.Count()} objects.");
        WriteLine();

        foreach (var e in set)
        {
            WriteLine(e);
        }

        WriteLine();
        WriteLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但我希望在显示实体之前按主键排序。如果我有DbContext它,它会很容易通过做这样的事情来完成:

var entityType = db.Model.FindEntityType(typeof(T));
var primaryKeyName = entityType.FindPrimaryKey().Properties.First().Name;
var set = db.Set<T>();
var orderedEntities = (set.OrderBy(e=> e.GetType().GetProperty(primaryKeyName).GetValue(e,null))).ToList();
Run Code Online (Sandbox Code Playgroud)

有没有办法从DbSet?开始获得相同的结果?

Iva*_*oev 6

这是可能的,但不是“官方” - 您必须使用一些标记为此API 支持实体框架核心基础结构的方法,并且不打算直接从您的代码中使用。此 API 可能会在未来版本中更改或删除。.

您基本上利用了DbSet<T>implements的事实IInfrastructure<IServiceProvider>,因此您可以IDbContextServices通过GetService方法获取以从Model属性中获取模型:

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;

...
var model = set.GetService<IDbContextServices>().Model;
var entityType = model.FindEntityType(typeof(T));
var properties = entityType.GetProperties();
var primaryKeyName = entityType.FindPrimaryKey().Properties.First().Name;
var sortedSet = (set.OrderBy(e=> e.GetType().GetProperty(primaryKeyName).GetValue(e,null))).ToList();
...
Run Code Online (Sandbox Code Playgroud)