.NET Core:查找Entity Framework Core和Reflection的主键

3

如何使用反射 .dll 从 Entity Framework Core 2 数据库脚手架中找到主键?

我们需要根据实体名称找到主键成员,并将其作为字符串返回。

在 Sql Server 数据库上进行了反向脚手架。

modelBuilder.Entity<Product>(entity =>
{
    entity.HasKey(e => e.ProductInfoId)
     .HasName("PK_ProductInfoId");

尝试解决方案:

试图编写下一行代码,给出字符串实体名称:“Product”。

var assembly = Assembly.LoadFrom(@"C:\OnlineShoppingStore\bin\Debug\netcoreapp2.2\OnlineShoppingStore.dll");

assembly.GetTypes().Where(d=>d.Name = "OnlineStoreDbContext")

etc GetProperties().Where(e=>e.Name == "Product"))

其他资源:

出于代码生成工具的考虑,更倾向于使用反射而非实例化上下文来完成此操作,将为10个数据库项目执行。

C#中使用Entity Framework的通用存储库


1
你没有/无法获取DbContext派生类实例吗?你所要求的信息是由EF Core元数据API提供的,需要DbContext实例。就像这里https://dev59.com/GrPma4cB1Zd3GeqPrYDy#55880724 - Ivan Stoev
provided reply above - user12425844
1个回答

3

根据评论中的建议,您可以在代码中实例化上下文,并像Ivan的答案所述调用所有EF模型检查API:

var assembly = Assembly.LoadFrom(@"C:\OnlineShoppingStore\bin\Debug\netcoreapp2.2\OnlineShoppingStore.dll");
var contextType = assembly.GetTypes().First(d => d.Name == "OnlineStoreDbContext");
var ctx = Activator.CreateInstance(contextType) as DbContext; // instantiate your context. this will effectively build your model, so you must have all required EF references in your project
var p = ctx.Model.FindEntityType(assembly.GetTypes().First(d => d.Name == "Product")); // get the type from loaded assembly
//var p = ctx.Model.FindEntityType("OnlineStoreDbContext.Product"); // querying model by type name also works, but you'd need to correctly qualify your type names
var pk = p.FindPrimaryKey().Properties.First().Name; // your PK property name as built by EF model
UPD: 不要进行思维实验,这会让人感到困惑。 上述方法不需要您引用其他项目,也不需要您事先了解类型,除了字符串名称(似乎您已经有了)。 当您实例化您的数据库上下文时,EF中的基类构造函数将处理所有自定义覆盖,并返回完全构建的模型(即所有属性都将被考虑)。同样,只要您仅使用EF元数据API(可在基类DBContext类上使用),就不需要引用。希望这可以澄清问题。 UPD2: 回应我的评论中的IL Emit想法。请参见实现我的博客中的更多背景信息。这使我能够消除异常(但仍需至少一个DB提供程序)。

我概述了一个可能适合你的替代方案(我相信有一些限制)。你不能只是实例化上下文吗?由于它是代码生成器,性能可能并不重要? - timur
这两种方法都不需要你引用任何程序集。我可能没有表述清楚。你唯一需要的引用是EF Core NuGet包本身。你自己的程序集可以完全无需强依赖或引用就可以被遍历。 - timur
请查看上面的代码。它实例化了上下文并允许您查询已构建的模型。您仍然不需要引用其他程序集。 - timur
在FindEntityType上收到错误,System.InvalidOperationException:'未为此DbContext配置数据库提供程序。可以通过覆盖DbContext.OnConfiguring方法或使用应用程序服务提供程序上的AddDbContext来配置提供程序。如果使用AddDbContext,则还请确保您的DbContext类型在其构造函数中接受一个DbContextOptions<TContext>对象,并将其传递给DbContext的基础构造函数。' - user12425844
有点希望我能找到属性而不必实例化整个东西。 - user12425844
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接