Преобразовать сущность Entity Framework Core в строку SQL - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь сгенерировать оператор SQL MERGE из сущности Entity Framework Core.Для этого мне нужно преобразовать все свойства сущности в строки SQL, например:

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

Похоже, EF Core использует класс ValueConverterSelector как фабрику для всех различных внутренних , а такжепользовательские преобразователи значений.Мне нужно получить это из контекста.Как я могу это сделать?


ОБНОВЛЕНИЕ: Благодаря Ивану Стоеву он предложил следующий способ получить converterSelector:

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

Я сталкиваюсьновая проблема с этим.Просматривая приватные поля, я вижу, что этот селектор не имеет зарегистрированных преобразователей.Следовательно, я все еще не могу получить правильный конвертер для каждого свойства для сущностей.Мне нужен конвертер с точными пользовательскими и встроенными конвертерами, которые использует EF.Есть идеи?

enter image description here

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Вы можете получить любую из служб контекста EF Core, добавив

using Microsoft.EntityFrameworkCore.Infrastructure;

, который дает вам доступ к методам расширений, определенным в классе AccessorExtensions , и в частности GetService method.

Так что для конкретного вопроса вы бы использовали что-то вроде этого:

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();
0 голосов
/ 21 июня 2019

Чтобы получить значение SQL для свойства с использованием Entity Framework, вам необходимо:

var entry = context.Entry(model);
var prop = entry.Properties.First(); // Let's say for the 1st one
var sqlValue = prop.Metadata
    .FindRelationalMapping()
    .GenerateProviderValueSqlLiteral(prop.CurrentValue);
...