MVC3型号&复杂的关系

时间:2011-10-26 12:47:48

标签: asp.net-mvc-3 models relationships navigation-properties

假设您有以下型号:

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列表,那么处理这种情况的最佳方法是什么?

目前我唯一的解决方案就是拉出两个列表,并在我循环穿过狗时抓住颜色。似乎应该有一种更优雅的方式。

1 个答案:

答案 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%确定这是不是你的问题。