EF Core - Самореферентные отношения с пользовательскими внешними / основными ключами, а не сопоставленными свойствами - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь внедрить самореферентные отношения в EF Core. Я пытаюсь использовать пользовательский внешний ключ и главный ключ, которые не сопоставлены с реальными столбцами базы данных.

С приведенным ниже кодом я получаю сообщение об ошибке

'Отсутствует поле поддержки можно найти для свойства 'HeadOfHouseholdForeignKey' типа сущности 'Person', и у свойства нет установщика

. Есть ли способ получить эти внешние / главные ключи, которые не сопоставлены со столбцом в БД? Есть ли способ сделать это красиво в EF Core?

Пример:

PersonContext.cs

using Microsoft.EntityFrameworkCore;

namespace ConsoleApp1
{
    public class PersonContext : DbContext
    {
        DbSet<Person> People;
        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<Person>()
                .HasOne(p => p.HeadOfHouseHold)
                .WithMany()
                .HasForeignKey(p => p.HeadOfHouseholdForeignKey)
                .HasPrincipalKey(p => p.HeadOfHouseholdPrincipalKey);
        }
    }
}

Person.cs

namespace ConsoleApp1
{
    internal class Person
    {
        public int PersonId { get; set; }
        public string Name { get; set; }

        public string FamilyName { get; set; }

        public string PersonSequenceNumber { get; set; }

        public Person HeadOfHouseHold { get; set; }

        public string HeadOfHouseholdForeignKey
        {
            get
            {
                // Head of household always has '01' as PersonSequenceNumber in DB, other members increment from 01 to 02, 03, etc
                if (PersonSequenceNumber != "01")
                {
                    return FamilyName + "01";
                }
                else
                {
                    return null;
                }
            }
        }

        public string HeadOfHouseholdPrincipalKey
        {
            get
            {
                return FamilyName + PersonSequenceNumber;

            }
        }
    }
}

Ответы [ 2 ]

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

Невозможно иметь отношение в EF Core, которое не определено с помощью базы данных ниже. Вы пытаетесь использовать внешний ключ, используя свойство только для чтения, и это не поддерживается.

Если вы просто хотите .Include () Person таблица, вы можете использовать составной ключ:

.HasForeignKey(p => new { p.FamilyName, p.PersonSequenceNumber) });

См. Примеры по адресу: Отношения ядра EF #Foreign key и Отношения ядра EF # Принципиальный ключ

PS. Я полагаю, что основной ключ должен быть из ссылочной таблицы, а не текущий:

.HasPrincipalKey(parent => parent.HeadOfHouseholdPrincipalKey);
0 голосов
/ 17 января 2020

При создании модели вам необходимо отобразить именно то, что находится в базе данных. Поэтому, если я правильно понимаю, что вы пытаетесь сделать, вам нужно сделать 2 вещи:

  1. Удалите эти объявления для столбцов, которых нет в базе данных. Вам нужен первичный ключ в базе данных, и это единственное, что вам нужно объявить при создании модели:

    // Remove these as these fields are not in the DB
    .HasForeignKey(p => p.HeadOfHouseholdForeignKey)
    .HasPrincipalKey(p => p.HeadOfHouseholdPrincipalKey);
    
  2. Добавьте атрибут NotMapped в свойства которые не имеют столбец в базе данных следующим образом:

    [NotMapped]
    public string HeadOfHouseholdForeignKey
    // ...
    
    [NotMapped]
    public string HeadOfHouseholdPrincipalKey
    // ...
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...