#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%, была ли это ваша проблема.