Сущность с одним отношением 1: 1 и 1: многие - настройка внешних ключей - PullRequest
1 голос
/ 24 мая 2019

У меня есть эта простая модель, и я хочу настроить отношения между ними

одна компания имеет один логотип

, а одна компания может иметь много файлов

public class Company
{
    public int Id { get; set; }

    public File Logo { get; set; }

    public List<File> Attachments { get; set; } = new List<File>();
}

public class File
{
    public int Id { get; set; }

    public Company Company { get; set; }

    public int CompanyId { get; set; }  

    (...)
}

public class CompanyConfiguration : IEntityTypeConfiguration<Company>
{
    public void Configure(EntityTypeBuilder<Company> builder)
    {
        builder
            .HasMany(x => x.Attachments)
            .WithOne(x => x.Company)
            .HasForeignKey(x => x.CompanyId);

        builder
           .HasOne(x => x.Logo)
           .WithOne(x => x.Company)
           .HasForeignKey(x => x.); // x. doesnt show me anything about "File" class. It looks like assembly

    }
}

Но так как мне, вероятно, нужно два FK

, я изменил его на:

public class File
{
    public int Id { get; set; }

    public Company Company { get; set; }
    public int CompanyId { get; set; }  

    public Company CompanyOtherProperty { get; set; }
    public int CompanyOtherPropertyId { get; set; }
}

, но даже если я вставлю имя FK в виде строки

public class CompanyConfiguration : IEntityTypeConfiguration<Company>
{
    public void Configure(EntityTypeBuilder<Company> builder)
    {
        builder
            .HasMany(x => x.Attachments)
            .WithOne(x => x.Company)
            .HasForeignKey(x => x.CompanyId);

        builder
           .HasOne(x => x.Logo)
           .WithOne(x => x.CompanyOtherProperty)
           .HasForeignKey("CompanyOtherPropertyId");
    }
}

System.InvalidOperationException: 'Вы настраиваете связь между' Company 'и' File ', но указали внешний ключ в' CompanyOtherPropertyId '.Внешний ключ должен быть определен для типа, который является частью отношения. '

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Учитывая ваши потребности, я бы сделал это, используя наследование, поскольку у Logo и Attachements есть общие свойства, но не одинаковые отношения

public abstract class File
{
    public int Id { get; set; }
    .....
}

public class Logo : File
{
    ....
}

public class Attachement : File
{
    public Company Company { get; set; }

    public int CompanyId { get; set; }
}

public class Company
{
    public int Id { get; set; }

    public Logo Logo { get; set; }

    public int LogoId { get; set; }

    public ICollection<Attachement> Attachements { get; set; } = new List<Attachement>();

}
public DbSet<Company> Companies { get; set; }

public DbSet<Attachement> Attachements { get; set; }

public DbSet<Logo> Logos { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<File>().HasDiscriminator();
}
0 голосов
/ 24 мая 2019

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

У вас должны быть отдельные модели для File и Logo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...