Установите значение сравнения в ASP. NET Core 3.1 - PullRequest
2 голосов
/ 24 января 2020

Я использовал «HasConversion» в моем DBContext, чтобы определить JSonArray (Language / Value) и сохранить его как текстовое поле на века, и он работает как шарм, я добавил новый проект в свое решение, ничего не изменилось, но потом Я получил новую ошибку при добавлении миграции, касающуюся «установки сравнения значений».

Моя Модель выглядит так:

    public class Brand
    {
        public int Id { get; set; }
        public new IList<LangValue> Name { get; set; } = new List<LangValue>();
    }

и DBContext это как:

    modelBuilder.Entity<Brand>(t =>
    {

        t.Property(p => p.Name).HasConversion(
            v => JsonConvert.SerializeObject(v, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include}),
            v => JsonConvert.DeserializeObject<IList<LangValue>>(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include})
         );
    });

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

Microsoft .EntityFrameworkCore.Model.Validation [10620] Свойство «Имя» для типа сущности «Бренд» является типом коллекции или перечисления с преобразователем значений, но без компаратора значений. Установите средство сравнения значений, чтобы обеспечить правильное сравнение элементов коллекции / перечисления.

1 Ответ

1 голос
/ 24 января 2020

Из документации класса ValueComparer :

Указывает пользовательский снимок значения и сравнение для типов CLR, которые нельзя сравнивать с Equals (Object, Object) и / или которые нуждаются в глубоком / структурная копия при создании снимка. Например, для массивов примитивных типов потребуется и то и другое, если мутация должна быть обнаружена.

Снимок - это процесс создания копии значения в снимке, чтобы впоследствии его можно было сравнить, чтобы определить, изменилось ли оно. Для некоторых типов, таких как коллекции, это должна быть глубокая копия коллекции, а не просто поверхностная копия ссылки.

Вы можете найти более подробную информацию о том, как настроить ValueComparer на этом выпуск:

https://github.com/dotnet/efcore/issues/17471

...