Модели MVC3 и сложные взаимосвязи

#asp.net-mvc-3 #models #relationships #navigation-properties

#asp.net-mvc-3 #Модели #взаимосвязи #навигация-свойства

Вопрос:

Допустим, у вас есть следующие модели:

 public class Dog {
  public int DogId { get; set; }
  public string Name { get; set; }
}

public class Cat {
  public int CatId { get; set; }
  public string Name { get; set; }
}

// This model/table allows us to link multiple colors to an animal
// Lets say type of 1 is dog, 2 is cat for simplicity
public class AnimalColor {
  public int ObjectId { get; set; }
  public int TypeId { get; set; }
  public virtual Color Color { get; set; }
}

public class Color {
  public int ColorId { get; set; }
  public string Description { get; set; }
}
  

Проблема с этой архитектурой заключается в том, что AnimalColor технически является навигационным свойством как для Dog, так и для Cat, но его сложность не позволяет вам использовать «встроенные» функции, такие как взаимосвязь между AnimalColor и Color .

Связь между Dog и AnimalColor имеет условие TypeId , не говоря уже о том, что ForeignKey не будет работать должным образом, потому что имена ключей не совпадают (DogId и ObjectId).

Мой вопрос заключается в следующем: я полностью упускаю что-то, что заставляет это работать? Если нет, то каков наилучший способ справиться с такой ситуацией, если я хочу получить список собак с AnimalColors в качестве свойства?

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

Ответ №1:

Из того, что я понимаю из вашего вопроса, я бы написал так «

 public class Animal {
  public int ID { get; set; }
  public List<Color> Colors { get; set; }
  public string Name { get; set; }
}
public class Dog : Animal { }

public class Cat : Animal { }
  

Таким образом, вам не нужно TypeId , вы можете проверить тип следующим образом:

 Cat a = new Cat();
Dog b = new Dog();
Animal c = new Dog();
if (a is Cat) {...}  // true
if (b is Dog) {...}  // true
if (c is Dog) {...}  // true
  

если у вас больше многоуровневых цветов:

 a.Colors.Add(new Color(255, 255, 255));
a.Colors.Add(new Color(100, 100, 0));
  

Но я не уверен на 100%, была ли это ваша проблема.