我正在尝试从 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 正在使用的精确自定义和内置转换器的转换器选择器。有什么想法吗?
最佳答案
您可以通过添加来获取任何 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/