假设您有以下型号:
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作为属性拉出Dogs列表,那么处理这种情况的最佳方法是什么?
目前我唯一的解决方案就是拉出两个列表,并在我循环穿过狗时抓住颜色。似乎应该有一种更优雅的方式。
答案 0 :(得分:0)
从我对你的问题的理解,我会这样写“
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
如果你有更多的mulyiple颜色:
a.Colors.Add(new Color(255, 255, 255));
a.Colors.Add(new Color(100, 100, 0));
但我不能100%确定这是不是你的问题。