EF Core 中的导航映射问题

Navigation mapping issues in EF Core

我正在尝试实现以下布局:

用户 table(有 link 用户详细信息) 用户详细信息 table(持有 link 到各种详细信息 table)

但出现以下错误:

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.

我知道如果 entity framework 无法识别每个地址到 link 的地址,就会出现这个问题 - 但我想我通过指定 2 link 来解决这个问题模型中的 s,然后是映射 class 中的每个键映射。任何帮助都会很棒!

我的客户端模型和映射如下所示:

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);
        }
    }

能否尝试删除"WithOne"的内容?

试试这个:

builder.HasOne(e => e.PostalAddress).WithOne().HasForeignKey<ClientDetails>(e => e.PostalAddressId);
builder.HasOne(e => e.ResidentialAddress).WithOne().HasForeignKey<ClientDetails>(e => e.ResidentialAddressId);

找到这个 post:

完成解决方案 3,客户端详细信息现在有一个地址集合(链接了地址类型),然后我在客户端详细信息上添加了一个地址 getter 以获得我想要的地址晚点。现在似乎一切正常。