Проблемы с отображением навигации в EF Core - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь получить следующий макет:

Таблица пользователей (содержит ссылку на данные пользователя) Таблица данных пользователя (содержит ссылки на различные таблицы сведений)

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

System.InvalidOperationException: Cannot create a relationship between 'Address.ClientDetails' and 'ClientDetails.ResidentialAddress', because there already is a relationship between 'ClientDetails.PostalAddress' and 'Address.ClientDetails'. Navigation properties can only participate in a single relationship.

Я понимаю, что эта проблема возникнет, если структура сущности не сможет определить, какой адрес связать с каждым адресом - но я подумал, что позабочусь об этом, указав 2 ссылки в модели, а затем каждая ключевая карта в классе отображения. Любая помощь будет великолепна!

моя модель и отображение клиента выглядит следующим образом:

public class Client : BaseEntity
    {
        public ClientDetails ApplicantDetails
        {
            get
            {
                return this.ClientDetails.SingleOrDefault(e => e.ClientType == Enums.ClientType.Applicant.ToString());
            }
        }

    public ClientDetails SpouseDetails
    {
        get
        {
            return this.ClientDetails.SingleOrDefault(e => e.ClientType == Enums.ClientType.Spouse.ToString());
        }
    }
    public ICollection<ClientDetails> ClientDetails { get; set; }
    public ICollection<BankDetails> BankDetails { get; set; }
    public ICollection<Expenses> Expenses { get; set; }
    public ICollection<Obligation> Obligations { get; set; }
    public ICollection<Budget> Budgets { get; set; }
    public ICollection<Document.Document> Documents { get; set; }
    public virtual Workflow.Workflow Workflow { get; set; }

Отображение

public class ClientMapping: IEntityTypeConfiguration<Entities.Client.Client>
{
    public void Configure(EntityTypeBuilder<Entities.Client.Client> builder)
    {
        builder.ToTable("Client");
        builder.HasKey(e => e.Id);
        builder.HasMany(e => e.ClientDetails).WithOne(e => e.Client).HasForeignKey(e => e.ClientId);
        builder.HasMany(e => e.Documents).WithOne(e => e.Client).HasForeignKey(e => e.ClientId);
        builder.HasOne(e => e.Workflow).WithOne(e => e.Client).HasForeignKey<Entities.Workflow.Workflow>(e => e.ClientId);
        builder.HasMany(e => e.Obligations).WithOne(e => e.Client).HasForeignKey(e => e.ClientId);
        builder.HasMany(e => e.Expenses).WithOne(e => e.Client).HasForeignKey(e => e.ClientId);
        builder.HasMany(e => e.Budgets).WithOne(e => e.Client).HasForeignKey(e => e.ClientId);
        builder.HasMany(e => e.BankDetails).WithOne(e => e.Client).HasForeignKey(e => e.ClientId);

        builder.Ignore(e => e.ApplicantDetails);
        builder.Ignore(e => e.SpouseDetails);
    }
}

Сведения о клиенте и отображение

public class ClientDetails
    {
        public int ClientId { get; set; }
        public int PersonalDetailsId { get; set; }
        public int EmployerId { get; set; }
        public int ResidentialAddressId { get; set; }
        public int PostalAddressId { get; set; }
        public int IncomeId { get; set; }
        public string ClientType { get; set; }
        public virtual Client Client { get; set; }
        public virtual PersonalDetails PersonalDetails { get; set; }
        public virtual Employer Employer { get; set; }
        public virtual Address ResidentialAddress { get; set; }
        public virtual Address PostalAddress { get; set; }
        public virtual Income Income { get; set; }
    }

отображение

public class ClientDetailsMapping : IEntityTypeConfiguration<Entities.Client.ClientDetails>
    {
        public void Configure(EntityTypeBuilder<ClientDetails> builder)
        {
            builder.ToTable("ClientDetails");
            builder.HasKey(e => new { e.IncomeId, e.PersonalDetailsId, e.ClientId, e.PostalAddressId, e.ResidentialAddressId } );
            builder.HasOne(e => e.Income).WithOne(e => e.ClientDetails).HasForeignKey<ClientDetails>(e => e.IncomeId);
            builder.HasOne(e => e.PostalAddress).WithOne(e => e.ClientDetails).HasForeignKey<ClientDetails>(e => e.PostalAddressId);
            builder.HasOne(e => e.ResidentialAddress).WithOne(e => e.ClientDetails).HasForeignKey<ClientDetails>(e => e.ResidentialAddressId);
            builder.HasOne(e => e.Employer).WithOne(e => e.ClientDetails).HasForeignKey<ClientDetails>(e => e.EmployerId);
            builder.HasOne(e => e.PersonalDetails).WithOne(e => e.ClientDetails).HasForeignKey<ClientDetails>(e => e.PersonalDetailsId);
        }
    }

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Нашел этот пост:

ef core - два один на один на главном ключе

Закончено внедрение решения 3, в сведениях о клиенте теперь есть набор адресов (с которым связан тип адреса), я затем добавил получатель адреса в детали клиента, чтобы получить нужный адрес позже. Кажется, теперь все работает правильно.

0 голосов
/ 20 апреля 2020

Можете ли вы попробовать удалить содержимое «WithOne»?

попробуйте это:

builder.HasOne(e => e.PostalAddress).WithOne().HasForeignKey<ClientDetails>(e => e.PostalAddressId);
builder.HasOne(e => e.ResidentialAddress).WithOne().HasForeignKey<ClientDetails>(e => e.ResidentialAddressId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...