EF Code First Fluent API, определяющий продукт, классовые отношения - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь создать составной внешний ключ (если это правильный термин), который навязывает тип класса продукта для таблицы, где продукт является обязательным, а класс - нет.Я хотел бы использовать Code First и Fluent API для достижения этой модели.

Сценарий таков: у меня есть товары, которые могут иметь много сортов и билетов (доставок), для которых требуется товар и, возможно, сорт,

Проблема, с которой я столкнулся, заключается в том, что приведенное ниже определение модели не учитывает отношение товара / сорта к билетам.Поэтому я могу ввести билет с оценкой, не связанной с товаром, указанным в билете.Я пробовал различные беглые заявления без успеха.

Как создать внешний ключ, который предотвращает создание недопустимой товарной категории в таблице заявок?

У меня есть следующая модель:

public class Commodity
{
    public int CommodityId { get; set; }
    ...

    public virtual ICollection<Grade> Grades { get; set; } = new HashSet<Grade>();
    public virtual ICollection<Ticket> Tickets { get; set; } = new HashSet<Ticket>();
}

public class Grade
{
    public int GradeId { get; set; }
    ...

    public virtual Commodity Commodity { get; set; }
    public virtual ICollection<Ticket> Tickets { get; set; } = new HashSet<Ticket>();
}

public class Ticket
{
    public int TicketId { get; set; }
    ...

    public virtual Commodity Commodity { get; set; }
    public virtual Grade Grade { get; set; }
}

public class MyEntities : DbContext
{
    public virtual DbSet<Commodity> Commodities { get; set; }
    public virtual DbSet<Grade> Grades { get; set; }
    public virtual DbSet<Ticket> Tickets { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Entity<Commodity>()
            .HasMany(c => c.Grades)
            .WithRequired(c => c.Commodity)
            .WillCascadeOnDelete(true);

    modelBuilder.Entity<Commodity>()
            .HasMany(c => c.Tickets)
            .WithRequired(t => t.Commodity)
            .WillCascadeOnDelete(true);

    modelBuilder.Entity<Grade>()
            .HasMany(g => g.Tickets)
            .WithOptional(t => t.Grade);
    }
}

Спасибо, Тони

...