Может ли класс наследовать от класса Entity Framework и все еще сохраняться обратно в БД, используя сопоставления унаследованных классов? - PullRequest
1 голос
/ 27 апреля 2011

Может ли класс наследовать от класса Entity Framework и все еще сохраняться обратно в БД, используя сопоставления унаследованных классов?Я получил ошибки, пытаясь получить производные от класса Self-Tracking Entity, когда я пытаюсь сохранить SaveChanges, утверждая, что тип не имеет сопоставлений.Я бы надеялся, что, поскольку тип был унаследован от класса Entity, он также мог как-то наследовать отображения сущностей, чтобы это работало.Кто-нибудь смог заставить это работать?

Сценарий, который я пытаюсь поддержать, заключается в расширении объекта Entity в другой сборке, которая ссылается на сборку, содержащую сущность и сопоставления.Частичные классы и отображения компилируются в сборку, содержащую объекты Entity.Поэтому я не могу сделать это с помощью частичных классов.

Ответы [ 2 ]

5 голосов
/ 27 апреля 2011

Нет, это невозможно с EDMX (и объектами самоконтроля). Если вы хотите сохранить производный тип, он также должен быть отображен. Если вам нужно что-то добавить в сгенерированный код, используйте свою собственную частичную часть класса сущности.

Удивительно, но похоже, что это возможно с первым кодом (EFv4.1 и DbContext API), но в этом случае вы не можете использовать объекты самоконтроля. Я только что проверил базу данных, и это невозможно с кодом Во-первых, как хорошо. Он молча создает наследование TPH, а производный класс отображается как другая сущность.

1 голос
/ 27 апреля 2011

Если вам действительно не нужно переопределять некоторые данные или функции по умолчанию, лучше всего вместо этого просто расширить класс.Поскольку классы EF объявлены как partial, вы можете создать другой файл кода и добавить в него свои собственные методы или свойства.Затем вы получаете всю стойкость объекта, а также свой пользовательский код.

public partial class MyEntity
{
   //Extend the base object
   public string FormattedName
   {
      get
      {
         return String.Format("Lookie this! {0}/{1}", this.SomeString, this.SomeInt);
      }
   }
}

Edit - В ответ на ваше разъяснение, ваш лучший выбор, если вам нужно изменить класс EFв другой сборке, к сожалению, создать класс-оболочку, который принимает класс Entity в качестве члена.Затем вы должны написать все новые функциональные возможности для доступа к публичным частям в штучной упаковке.Это не даст вам настойчивости в отношении новых свойств, но вы все равно этого не получите.

...