Ger Hayden Ответов: 1

Консультация на тему "оператор без принуждения определяется между системой типов.и системы типа INT16''.логическое'." MySQL и сервер тож


Вслед за прошлыми неделями запутывать что касается длины ключа, то мне нужен совет по операторам принуждения между типами с использованием MySql.

Часть неприятностей прошлой недели заключалась в том, что я не смог адекватно объяснить, что мне нужно, поэтому надеюсь, что на этот раз я не попадусь в эту ловушку.

Напомним, что я пытаюсь использовать комбинированный пример с сайта Identity Server, но ориентируюсь на MySql, а не на SqlServer (где я отмечаю прекрасную новую статью от HHerzl).

Из - за того, как MySql содержит логические значения в целочисленных полях, когда EF попадает в логическое значение, я получаю: "Между типами 'System.Int16' и 'System не определен оператор принуждения.Булево"."

Пример поставляется с тремя контекстами, но только один из них, ApplicationDbContext, упоминается в исходном коде. Для этого я могу решить проблему в OnModelCreating с помощью:
builder
       .Entity<ApplicationUser>()
       .Property(u => u.EmailConfirmed).HasConversion<Int16>()
       ;


Проблема в том, что два других контекста, например ConfigurationDbContext, являются частью IdentityServer4.EntityFramework.DbContexts таким образом, источник не является частью примера. У меня есть несколько вариантов, и мне нужен совет, в каком направлении мне следует двигаться. Я рассматриваю это как свои варианты:

Замените MySql на SqlServer
Вероятно, это самая простая вещь, и, несмотря на то, что мой код имеет компоненты, которые имеют более чем 10-летнюю историю, усилия не будут огромными, потому что зависимые от базы данных вызовы были отделены от 1-го дня для этой возможности. Но мне нравится MySql.

Расширение ConfigurationDbContext с помощью частичного класса
Это позволило бы мне добавить метод OnModelCreating через partial. Но я не уверен, что это технически возможно, поскольку исходное определение не является частичным.

Создайте новый контекст, который наследуется от ConfigurationDbContext
Это все больше похоже на решение выбора, хотя это немного больше усилий, чем любой из предыдущих двух.

Извлеките копию самого кода IdentityServer4 и измените класс ConfigurationDbContext
Это дало бы мне значительную власть для преодоления препятствий MySql, но за счет выхода из "пути обновления" пакетов Identity Server nuget. Мне бы не хотелось идти по этому пути.

Что-то еще не перечисленное здесь


Итак, вкратце мне нужен совет о том, как я мог бы добавить метод OnModelCreating в класс IdentitySever ConfigurationDbContext.

Что я уже пробовал:

Я решил проблему в одном из трех мест, где она возникает, затем исследовал и перечислил возможности для ее решения в двух других. Теперь мне нужен совет, в каком направлении двигаться.

Christian Graus

Не идентичность сервера с открытым исходным кодом? Разве вы не можете просто скомпилировать свою собственную версию?

Ger Hayden

Привет, Кристиан, это один из моих вариантов, но против этого является то, что каждый раз, когда они публикуют изменение, я должен объединить его с моей вилкой.

Christian Graus

Да, это действительно отстой. Я бы предложил сделать ветку с условной компиляцией для MySQL и попросить их объединить ее

Ger Hayden

Я пробовал партиалы и расширения как для сущности, так и для контекста, а теперь клонирую в соответствии с вашим предложением. Все остальное меня не устраивало.

1 Ответов

Рейтинг:
12

Gerry Schmitz

(Вы расширяете сущность, а не dbContext?)

Если вы хотите рассматривать "int" как bool, создайте прокси-свойство; держите отображение ORM простым.

public short MyShort {get;set;}

[NotMapped]
public bool MyBool {get{return (MyShort == 1);} set {MyShort = value ? 1 : 0;}}


Добавьте код в класс сущностей; код сначала или как частичный класс.


Ger Hayden

Спасибо Джерри, я разберусь с этим, но мне нужно будет посмотреть, является ли определение сущности частью пакетов Identity Server Nuget, если это так, то я не хочу его менять, потому что это ставит меня на мою собственную вилку кода. Теперь ваша последняя мысль, добавив его как частичное, может быть победителем!

Ger Hayden

В конечном итоге я использовал SQL Server для Identity Server, но впоследствии столкнулся с той же проблемой в одном из моих собственных хранилищ данных, и это решение было просто идеальным.