Свойство X имеет тип Y, который не поддерживается текущим поставщиком базы данных

Я действительно новичок в EF (использую EF core 2.1) и до сих пор следил за кучей руководств, но теперь я решил создать свою собственную структуру БД и споткнулся при попытке добавить значение в БД:

private async Task<int> Insert()
{
    var address = new Address { AddressLine1 = "1 any street",  AddressLine2 = "", AddressLine3 = "", City = "Any city" };

    using (var context = new BranchContext())
    {
        context.Addresses.AddAsync(address);//ERROR HERE
        ....
    }
 }

Я получаю сообщение об ошибке:

InvalidOperationException: The property 'Branch.Address' is of type 'Address' which is not supported by current database provider. Either change the property CLR type or ignore the property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

Я создал следующие классы:

public class Address
{
    public int Id { get; set; }
    public int Guid { get; set; }
    public DateTime CreatedOn { get; set; }
    public string Number { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressLine3 { get; set; }
    public string Town { get; set; }
    public string City { get; set; }
    public string Postcode1 { get; set; }
    public string Postcode2 { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

public class Branch
{
    public string Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
    public IEnumerable<EmployeeBranch> Employee { get; set; }
    public bool IsMain { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Guid { get; set; }
    public string EmailAddress { get; set; }
    public JobTitle JobTitle { get; set; }
    public DateTime DateOfBirth { get; set; }
    public IEnumerable<EmployeeBranch> Branches { get; set; }
    public Branch PrimaryBranch { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PreferredName { get; set; }
    public Salutations Salutation { get; set; }
}

public enum Salutations
{
    Mr = 1,
    Mrs = 2,
    Miss = 3,
    Ms = 4
}

public class EmployeeBranch
{
    public int BranchId { get; set; }
    public Branch Branch { get; set; }
    public int EmployeeId { get; set; }
    public Employee Employee { get; set; }
}

public class JobTitle
{
    public int Id { get; set; }
    public string Guid { get; set; }
    public string Name { get; set; }
}

Затем я побежал:

Add-Migration init
Update-Database

Было создано следующее:

Свойство X имеет тип Y, который не поддерживается текущим поставщиком базы данных

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

Как решить эту проблему? Желательно без изменения структуры, хотя я рад, если есть веская причина для этого.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
0
27 747
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Кажется, в конце концов это был довольно простой ответ, ошибка заставила меня посмотреть на структуру моих классов и попытаться понять, что пошло не так. Проблема заключалась в том, что в моем BranchContext (который я не учел в своем вопросе) я подключился к OnModelCreating и установил адрес по мере необходимости.

Неправильно

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EmployeeBranch>()
        .HasKey(s => new { s.BranchId, s.EmployeeId });
    modelBuilder.Entity<Branch>()
        .Property(s => s.Address).IsRequired();
    modelBuilder.Entity<Branch>()
        .Property(s => s.Name).IsRequired();

    base.OnModelCreating(modelBuilder);
}

Верно

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EmployeeBranch>()
        .HasKey(s => new { s.BranchId, s.EmployeeId });

    modelBuilder.Entity<Address>()
        .Property(s => s.AddressLine1).IsRequired();
    modelBuilder.Entity<Address>()
        .Property(s => s.Postcode1).IsRequired();
    modelBuilder.Entity<Address>()
        .Property(s => s.Postcode2).IsRequired();
    ...the other required elements...
    modelBuilder.Entity<Branch>()
        .Property(s => s.Name).IsRequired();

    base.OnModelCreating(modelBuilder);
}

Предположение: цель состоит в том, чтобы сделать Address необходимым свойством Branch

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Branch>()
        .HasOne(s => s.Address)
        .WithMany()
        .IsRequired();
}

You can use the Fluent API to configure whether the relationship is required or optional

Источник: Обязательные и необязательные отношения

Эта ошибка также может появляться в глупых ситуациях ссылки на свойство навигации вместо сопоставленного свойства в ограничении или подобном:

modelBuilder.Entity<TheEntity>().HasKey(ma => new { ma.SomeKey, ma.NavPropInsteadOfProp });

К сожалению, ошибка недостаточно явная, но временное закомментирование виновника ошибки приведет к источнику.

Это было для меня. Спасибо, что упомянули об этом здесь. Моему помогло исправить

Josh 30.08.2020 09:20

Спасибо, была именно моя ситуация. Вы, вероятно, сэкономили мне 30 минут по крайней мере

refex 10.12.2020 18:54

Совершенно потрясающее предложение. Вы только что сэкономили мне много времени на загадки.

Grigor Margaritov 08.03.2021 13:44

Я также ссылался на свойство навигации... но не для определения ключа... это было, когда я пытался сопоставить с конкретным именем столбца.

Jason 07.06.2021 19:42

Другие вопросы по теме