Проблема конфигурации внешнего ключа EF Core - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю над переносом реального офисного проекта на Entity Framework Core и .NET Core.Я застрял, когда я хочу сделать Add-Migration.Кажется, что свойство навигации и внешний ключ не настроены должным образом.После многих попыток я не смог решить мою проблему.

Сообщение об ошибке при Add-Migration:

The relationship from 'PlanLang.Plan' to 'Plan.Lang' with foreign key properties {'PlanId' : int} cannot target the primary key {'GolfClubId' : int, 'PlanId' : int} because it is not compatible. Configure a principal key or a set of compatible foreign key properties for this relationship.

Вот мои сущности:

GolfClub

public class GolfClub
{
    public int Id { get; set; }
    //.. other properties, not important
}

План

public class Plan
{
    public int GolfClubId { get; set; }
    public int PlanId { get; set; }
    //.. other properties, not important

    public GolfClub GolfClub { get; set; }
    public ICollection<PlanLang> Lang { get; set; }
}

PlanLang

public class PlanLang
{
    public int GolfClubId { get;set; }
    public int PlanId { get; set; }
    public string Lang { get; set; }
    //.. other properties, not important

    public GolfClub GolfClub { get; set; }
    public Plan Plan { get; set; }
}

Вот мои конфигурации:

public class GolfClubConfiguration : IEntityTypeConfiguration<GolfClub>
{
    public void Configure(EntityTypeBuilder<GolfClub> builder)
    {
        builder.ToTable("gc_master");

        builder.HasKey(k => new { k.Id });
        builder.Property(p => p.Id).ValueGeneratedNever(); // to disable auto-increment

    }
}

public class PlanConfiguration : IEntityTypeConfiguration<Plan>
{
    public void Configure(EntityTypeBuilder<Plan> builder)
    {
        builder.ToTable("gc_plan_master");

        builder.HasKey(k => new { k.GolfClubId, k.PlanId });
        builder.Property(p => p.GolfClubId).ValueGeneratedNever(); // to disable auto-increment

        builder.HasMany(p => p.Lang).WithOne(p => p.Plan).HasForeignKey(FK => FK.PlanId);
        builder.HasOne(p => p.GolfClub).WithMany().HasForeignKey(FK => FK.GolfClubId);
    }
}

public class PlanLangConfiguration : IEntityTypeConfiguration<PlanLang>
{
    public void Configure(EntityTypeBuilder<PlanLang> builder)
    {
        builder.ToTable("gc_plan_master_lang");

        builder.HasKey(k => new { k.GolfClubId, k.PlanId, k.Lang });
        builder.Property(p => p.GolfClubId).ValueGeneratedNever(); // to disable auto-increment
        builder.Property(p => p.Lang).HasMaxLength(5);

        builder.HasOne(p => p.GolfClub).WithMany().HasForeignKey(FK => FK.GolfClubId);
    }
}

Я хочу, чтобы у Plan был 1 внешний ключ (GolfClubId) и PlanLang 2 (PlanId и GolfClubId).

Каким образом я могу продолжить?

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 17 декабря 2018

Проблема в GolfClubId из PlanLang.У вашего Plan есть список PlanLang и GolfClubId, в котором у отдельного PlanLang есть GolfClubId, что не имеет смысла, и поэтому EF Core не может настраивать / определять отношения.

Удалить GolfClubId с PlanLang потому что PlanLang уже связан с GlofClub до Plan, потому что Plan имеет GolfClubId.

Напишите классы вашей модели следующим образом:

public class GolfClub
{
    public int Id { get; set; }
    //.. other properties, not important
}

public class Plan
{
    public int PlanId { get; set; }
    public int GolfClubId { get; set; }

    //.. other properties, not important

    public GolfClub GolfClub { get; set; }
    public ICollection<PlanLang> PanLangs { get; set; }
}

public class PlanLang
{
    public int PlanId { get; set; }
    public string Lang { get; set; }
    //.. other properties, not important

    public Plan Plan { get; set; }
}

И переписать Plan и PlanLang EntityConfigurations следующим образом:

public class PlanConfiguration : IEntityTypeConfiguration<Plan>
{
    public void Configure(EntityTypeBuilder<Plan> builder)
    {
        builder.ToTable("gc_plan_master");

        builder.HasKey(k => k.PlanId);

        builder.HasMany(p => p.PlanLangs).WithOne(p => p.Plan).HasForeignKey(FK => FK.PlanId);
        builder.HasOne(p => p.GolfClub).WithMany().HasForeignKey(FK => FK.GolfClubId);
    }
}

public class PlanLangConfiguration : IEntityTypeConfiguration<PlanLang>
{
    public void Configure(EntityTypeBuilder<PlanLang> builder)
    {
        builder.ToTable("gc_plan_master_lang");

        builder.HasKey(k => new { k.PlanId, k.Lang });

        builder.Property(p => p.Lang).HasMaxLength(5);
        builder.HasOne(p => p.Plan).WithMany().HasForeignKey(FK => FK.PlanId);
    }
}

Теперь все должно работать нормально!

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