2016-02-11 6 views
0

Итак, у меня есть эта проблема с моим дизайном базы данных. У меня есть четыре таблицы: GARMENTS, Оснастка, Изображения и шрифты.EntityFramework, таблица проектирования базы данных с обнуляемыми внешними ключами

одежды может иметь несколько или никакие вложения так, что легко карта:

modelBuilder.Entity<Garment>().HasMany(m => m.Attachments).WithOptional().HasForeignKey(m => m.GarmentId); 

Но усложнение arrises с вложениями. Я прочитал, что наличие нескольких с нулевым значением внешних ключей - это плохая практика, но я не могу понять, как сопоставить этот поток.

прикрепленного может либо иметь изображение ИЛИ с Font. Он никогда не может иметь обоих и должен иметь хотя бы один.

Мой первоначальный класс выглядел следующим образом:

public class Attachment 
{ 
    public int ImageId { get; set; } 
    public int FontId { get; set; } 
    [Required] public int GarmentId { get; set; } 
    [MaxLength(50)] [Required] public string PanelId { get; set; } 

    public Image Image { get; set; } 
    public Font Font { get; set; } 
} 

, но это ничего не навязывает. Есть ли способ, которым EF может справиться с этим в хорошем смысле?

ответ

1

Вы можете использовать Entity Framework Validation и особенно IValidatableObject

public class Attachment : IValidatableObject 
{ 
    //... 

    public Image Image { get; set; } 
    public Font Font { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (Image == null && Font == null) 
     { 
      yield return new ValidationResult 
      ("Image or Font must be specified", new[] { "Image", "Font" }); 
     } 
     if (Image != null && Font != null) 
     { 
      yield return new ValidationResult 
      ("You cannot provide both an Image and a Font", new[] { "Image", "Font" }); 
     } 
    } 
} 

Если вам действительно нужно, и обеспечивается поддержка, вы можете добавить ограничение на хранилище данных. Для SQL Server см. CHECK CONSTRAINT.

+0

, что это было, если бы было 4 объекта? Конечно, есть лучший дизайн. Но если нет, я не хочу, чтобы все они были операторами: – r3plica

+0

@ r3plica вы могли написать пользовательский 'ValidationAttribute'. Для хорошего образца см. «СвойстваMustMatchAttribute». Если вы действительно хотите перепроектировать все это, у вас может быть базовый класс для 'Image',' Font', ... и иметь внешний ключ базового класса. – Guillaume

Смежные вопросы