Я пытаюсь создать составной внешний ключ (если это правильный термин), который навязывает тип класса продукта для таблицы, где продукт является обязательным, а класс - нет.Я хотел бы использовать 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);
}
}
Спасибо, Тони