c# - 将 Entity Framework Core 实体转换为 SQL 字符串

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

我正在尝试从 Entity Framework Core 实体生成 SQL MERGE 语句。为此,我需要将所有实体属性转换为 SQL 字符串,例如:

bool   => 1 or 0
string => 'string'
int    => 123

看起来 EF Core 使用 ValueConverterSelector 类作为所有不同 internal 的工厂以及自定义值转换器。我需要从上下文中获取它。我该怎么做?


更新:感谢 Ivan Stoev,他提出了以下获取转换器选择器的方法:

var converterSelector = context.GetInfrastructure().GetService<IValueConverterSelector>()
var converters = converterSelector.Select(entry.Metadata.ClrType, prop.Metadata.ClrType);
// Converters collection is empty ;(

我遇到了一个新问题。通过检查私有(private)字段,我发现该选择器没有注册转换器。因此,我仍然无法为实体的每个属性获得正确的转换器。我需要一个具有 EF 正在使用的精确自定义和内置转换器的转换器选择器。有什么想法吗?

enter image description here

最佳答案

您可以通过添加来获取任何 EF Core 上下文服务

using Microsoft.EntityFrameworkCore.Infrastructure;

它使您可以访问 AccessorExtensions 中定义的扩展方法类,特别是 GetService方法。

因此,对于具体问题,您可以使用如下内容:

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

var valueConverterSelector = dbContext.GetService<IValueConverterSelector>();

并非每个属性都有关联的值转换器。目前(EF Core 2.2)您可以获得 IProperty 的值转换器与 EF Core 使用如下代码片段的方式类似:

using Microsoft.EntityFrameworkCore.Metadata.Internal;

IProperty property;
var valueConverter = property.FindMapping()?.Converter ?? property.GetValueConverter();

关于c# - 将 Entity Framework Core 实体转换为 SQL 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56694957/

相关文章:

c# - ASP.NET 5 控制台应用程序(包) - 如何从连接字符串创建 DBContext?

entity-framework - 如何清除 Entity Framework 对象中的验证结果

c# - Linq To Entities Group By 键中有多个表

c# - 数据库初始化程序未播种

c# - 为什么导出的报告是空的?

c# - ASP.NET 核心 WebSocket

c# - 我需要在发布 exe 文件时在每个 dll 中启用 ReadyToRun 吗?

javascript - 在没有 JS 警报的情况下,在加载时更改 ASP.NET 中的光标不起作用

c# - Javascript 在 IE 上工作,但在 Firefox 上不起作用,并给出错误,错误 : cprofiledetailscollapse is not defined

c# - 需要如何帮助将 system.serviceModel 配置部分移动到我的代码中