【问题标题】:Net Core: Find Primary Key of Entity Framework Core and ReflectionNet Core:查找Entity Framework Core和Reflection的主键
【发布时间】:2019-12-30 10:29:53
【问题描述】:

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

我们需要在给定 EntityName 的情况下找到主键成员,并将主键成员作为字符串返回。 对Sql Server数据库进行反向脚手架。

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

尝试解决方案:

尝试编写下一行代码,给定字符串实体名称:“产品”。

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 个 db 项目执行。

Generic Repository in C# Using Entity Framework

【问题讨论】:

  • 你没有/不能获得DbContext派生类实例吗?您要求的信息由需要 DbContext 实例的 EF Core 元数据 API 提供。喜欢这里stackoverflow.com/questions/55867725/…
  • 上面提供了回复

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


【解决方案1】:

扩展来自 cmets 的建议,您可以在代码中实例化上下文并调用 Ivan's answer 中概述的所有 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:在 cmets 中跟进我的 IL Emit 想法。请参阅 implementationmy blog 中的更多背景信息。这使我能够消除异常(但仍然必须至少有一个可用的数据库提供程序)。

【讨论】:

  • 我概述了一个可能对您有用的替代方案(我相信有一些警告)。您是否有理由不能仅实例化上下文?既然它是一个代码生成器,性能可能就不是问题了?
  • 上述两种方法都不需要您对程序集有任何引用。我可能没有很好地指出这一点。您需要它的唯一参考是对 EF 核心 nuget 包本身的参考。您自己的程序集可以在没有任何强依赖或引用的情况下被遍历。
  • 查看上面的代码。它实例化上下文并让您查询已构建的模型。您仍然不需要参考您的其他程序集
  • 好吧,我想我把你弄糊涂了。让我更新答案,看看是否可以澄清一点。
  • FindEntityType 接收错误,System.InvalidOperationException:'没有为此 DbContext 配置数据库提供程序。可以通过重写 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用 AddDbContext,则还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。'rd
猜你喜欢
  • 2020-06-03
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多