gpt4 book ai didi

c# - 如何获取 DbSet 的主键?

转载 作者:行者123 更新时间:2023-11-30 15:19:04 26 4
gpt4 key购买 nike

我使用 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();
}
}

这可行,但我希望在显示实体之前按主键对实体进行排序。如果我有 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 开始得到相同的结果?

最佳答案

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

你基本上利用了 DbSet<T> 的事实工具 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();
...

关于c# - 如何获取 DbSet 的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42645667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com