EF Code Первые абстрактные отношения? - PullRequest
4 голосов
/ 05 июля 2011

У меня есть класс, который наследует базовый класс, с которым связан другой класс.

Пример:

  • Базовый класс: Животное
  • Подкласс 1: Собака
  • Подкласс 2: Кошка
  • СвязанныйТаблица «многие»: Прививки
    • У собаки может быть несколько прививок.Это реализовано в виде Списка .
    • У кошки может быть несколько прививок.
    • У записи прививок может быть только одно животное, связанное с ней.
    • Вакцинация нене знаю, связано ли это с собакой или кошкой.(Собаки и кошки используют бесконтактные идентификаторы GUID.)

Таблицы животных нет;Животное - это абстрактный класс.Но вакцинация знает только о животных, а не о собаках.(EF, однако, знает об обоих.) Мои библиотеки классов разделены так, что Animal и Vaccination находятся в основной библиотеке, а Dog - в другой библиотеке, которая ссылается на базовую библиотеку.

При использовании Entity Framework Code Firstтаблица вакцинаций получает дополнительный столбец: Dog_ID, так как явное объявление List класса Dog создает вывод.Таким образом, этот столбец отображает запись о прививках собаке.Это было бы хорошо, за исключением того факта, что я хочу использовать этот дополнительный столбец для нескольких типов животных.Так, например, вместо того, чтобы иметь Dog_ID и Cat_ID, я хотел бы иметь Animal_ID, который может присоединиться либо к Dog, либо к Cat.

Поскольку Animal является абстрактным и не имеет таблицы DB, могу ли я выполнить это?возможно с беглым заявлением и / или объявлениями свойств / атрибутов?

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Ваша таблица Vaccination всегда будет иметь дополнительный столбец FK для каждого вакцинированного типа животных, если только вы не создадите таблицу Animal и не установите связь с этой таблицей. EF не может отображать и абстрагировать отношения высокого уровня - отношения должны следовать тем же правилам, как если бы вы создавали их непосредственно в базе данных.

Если только некоторые животные могут быть вакцинированы, вы можете добавить другую таблицу в иерархию и установить связь с этой новой таблицей (EF не может работать с интерфейсами). Для этого вам понадобится Таблица для каждого типа , и в текущей версии EF производительность ваших запросов значительно ухудшится.

2 голосов
/ 05 июля 2011

При условии, что всем вашим животным будут сделаны прививки

public abstract class Animal
{
   public string ID { get; set; }
   public ICollection<Vaccination> Vaccinations { get; set; }
}

public class Vaccination
{
   public string ID { get; set; }
   public string AnimalID { get; set; }
   public virtual Animal Animal { get; set; }
   //other properties
}

Тогда вы можете наследовать Cat и Dog и использовать Table per Type отображение.

1 голос
/ 08 июля 2011

Поэтому, когда я реализовал то, что в настоящее время помечено как ответ (что мне в конечном итоге необходимо создать таблицу Animal), я столкнулся с проблемами, потому что, как я объяснил в своем вопросе, у меня есть изолированный проект, объявляющий «Собаку».", и для этого и связанных с этим вопросов меня направляют здесь , здесь и здесь .

...