EF Core Add-Migration создает дополнительный столбец с ColumnName1 - PullRequest
1 голос
/ 02 апреля 2020

У меня есть следующие объекты, когда я генерирую миграцию, он создает два столбца с именами RestrictedCategoryId и RestrictedCategoryId1 (FK). Как решить эту проблему, чтобы сгенерировать только один столбец с FK?

Примечание: мне нужен OrderId в каждой сущности.

`C#

public class Order
{
    public Guid Id { get; set; }
    public DateTime OrderDate { get; set; }

    private List<Category> _categories;
    public List<Category> Categories => _categories;
}
public class Category
{
    public Guid Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }

    public Guid OrderId { get; set; }
    public Order Order { get; set; }

    private List<RestrictionCategory> _restrictedCategories;
    public List<RestrictionCategory> RestrictedCategories => _restrictedCategories;
}
public class RestrictionCategory
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public Guid OrderId { get; set; }
    public Order Order { get; set; }
    public Guid CategoryId { get; set; }
    public Category Category { get; set; }        
    public Guid RestrictedCategoryId { get; set; }
    public Category RestrictedCategory { get; set; }
}
public class OrderConfiguration : IEntityTypeConfiguration<Order>
{
    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.HasKey(o => o.Id);
        builder.Property(o => o.Id).IsRequired();
    }
}
public class CategoryConfiguration : IEntityTypeConfiguration<Category>
{
    public void Configure(EntityTypeBuilder<Category> builder)
    {
        builder.HasKey(c => new { c.Id, c.OrderId });
        builder.Property(o => o.Id).IsRequired();
        builder.Property(o => o.OrderId).IsRequired();

        builder.HasMany(c => c.RestrictedCategories).WithOne(cr => cr.Category)
            .HasForeignKey(cr => new { cr.CategoryId, cr.OrderId 
}).OnDelete(DeleteBehavior.NoAction);
    }
}
public class RestrictionCategoryConfiguration : IEntityTypeConfiguration<RestrictionCategory>
{
    public void Configure(EntityTypeBuilder<RestrictionCategory> builder)
    {
        builder.HasKey(c => new { c.Id, c.OrderId });
        builder.Property(o => o.Id).IsRequired();
        builder.Property(o => o.OrderId).IsRequired();

        builder.HasIndex(cr => new { cr.RestrictedCategoryId, cr.OrderId });
    }
}

` Сущности напоминает реальные.

1 Ответ

2 голосов
/ 02 апреля 2020

На самом деле вы получаете два дополнительных столбца:

RestrictedCategoryId = table.Column<Guid>(nullable: false),
RestrictedCategoryId1 = table.Column<Guid>(nullable: true), // <--
RestrictedCategoryOrderId = table.Column<Guid>(nullable: true) // <--

Очевидно, EF Core Соглашения о внешних ключах не очень хорошо работает с составными ключами, поэтому вы должны явно настроить отношения - аналогично к тому, что вы сделали для других отношений, поскольку ваша модель не имеет соответствующего свойства навигации по коллекции, вы должны использовать HasMany с аргументом типа generi c и без параметров, например, внутри CategoryConfiguration:

builder.HasMany<RestrictionCategory>()
    .WithOne(cr => cr.RestrictedCategory)
    .HasForeignKey(cr => new { cr.RestrictedCategoryId, cr.OrderId})
    .OnDelete(DeleteBehavior.NoAction);
...