Модели MVC3 и сложные отношения - PullRequest
0 голосов
/ 26 октября 2011

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

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 Ответ

0 голосов
/ 26 октября 2011

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

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

...