【问题标题】:How can I get the Primary Key for the DbSet?如何获取 DbSet 的主键?
【发布时间】:2017-03-07 10:23:21
【问题描述】:

我使用带有 fluent API 的 Net Core 1.1 和 Entity Framework Core。我正在为 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();
    }
}

这可行,但我希望在显示实体之前按主键对实体进行排序。如果我有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();

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

【问题讨论】:

    标签: c# .net-core entity-framework-core


    【解决方案1】:

    这是可能的,但不是“正式的”——您必须使用一些标记为 此 API 支持 Entity Framework Core 基础架构的方法,并且不打算直接从您的代码中使用。此 API 可能会在未来版本中更改或删除。

    您基本上利用DbSet&lt;T&gt;实现IInfrastructure&lt;IServiceProvider&gt;的事实,因此您可以通过GetService方法获得IDbContextServices,以便从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();
    ...
    

    【讨论】:

    • GetService 不再是 DbSet 上的方法。
    • @RogerFar 这不是真的。它仍然存在 - 在最新的官方 3.1 和 5.0 预览版中。可能您错过了“非官方”(内部)API 部分和所需的using Microsoft.EntityFrameworkCore.Infrastructure; - 上述方法是该命名空间内AccessorExtensions 类中的扩展方法。所以我不得不让你“失望”,但上面的代码仍然有效:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多