Nano Hash - криптовалюты, майнинг, программирование

На принадлежащий тип сущности необходимо ссылаться из другого типа сущности через навигацию.

В моем приложении есть объект под названием Person. Есть два типа пользователей, Студент и Профессор, которые наследуются от Person.

У каждого человека есть свойство настроек:

public abstract class Person
{
    public Guid UserId { get; set; }
    public string Name { get; set; }

    public PersonSettings Settings { get; set; }
}

public class Student : Person
{
}

public class Professor : Person
{
}

Мой класс PersonSettings - это всего лишь пара свойств. Это не объект, который нужно хранить в базе данных, поэтому я пометил его как принадлежащий:

[Owned]
public class PersonSettings
{
    public bool NotificationsEnabled { get; set; }
    public int GymPassId { get; set; }
}

Они хранятся в базе данных как json, которые я использую значения преобразования EF Core в моей конфигурации сущности Person для ее сериализации и десериализации:

builder.Property(p => p.Settings).HasConversion(
    s => JsonConvert.SerializeObject(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
    s => JsonConvert.DeserializeObject<PersonSettings>(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));

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

На принадлежащий тип сущности «PersonSettings» необходимо ссылаться из другого типа сущности через навигацию. Добавьте навигацию к типу сущности, которая указывает на «PersonSettings».

Что мне здесь делать? Я ничего не нашел в сообщении об ошибке. Не уверен, связано ли это с тем, что Person является абстрактным классом.


  • Невозможно воспроизвести с последними битами EF Core 2.1.1. Можете ли вы включить всю необходимую свободную конфигурацию? 03.08.2018

Ответы:


1

Я тоже не умею воспроизводить, но здесь вам не нужен собственный тип.

Использование собственных типов является альтернативой использованию JSON-сериализации нескалярных свойств. При использовании собственных типов тип сохраняется вместе с сущностью, которая на него ссылается. Так как собственный тип EF создаст таблицу Person с отдельными столбцами для Settings_NotificationEnabled и Settings_GymPassId.

Таким образом, вы можете просто удалить OwnedAttribute и убедиться, что вы не объявляете его как Entity со свойством типа DbSet<PersonSettings> в вашем DbContext.

Что касается выбора, я бы обычно использовал собственный тип для этого сценария, чтобы вы могли запрашивать базу данных по отдельным свойствам PersonSettings.

Использование JSON-преобразования нескалярного свойства полезно для случая, когда у вас есть коллекция, поскольку EF Core в настоящее время не поддерживает коллекции собственных типов.

03.08.2018
  • Я случайно добавил его как DbSet в свой контекст, спасибо! 03.08.2018
  • Начиная с EF Core 2.2 поддерживаются коллекции принадлежащих типов. 18.01.2019

  • 2

    У меня была та же проблема, и я решил ее решить, следуя документации здесь.

    По сути, вы хотите добавить OwnsOne в конфигурацию вашей сущности для Person:

    builder.OwnsOne(p => p.PersonSettings, ps => {
        //if need be add additional settings here for NotificationsEnabled and GymPassId
    });
    

    Это создаст связь между Person и PersonSettings, которую генератор миграции использует для создания скрипта.

    20.01.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..