Может ли класс наследоваться от класса Entity Framework и по-прежнему сохраняться обратно в БД, используя сопоставления унаследованных классов?

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

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


person John Egbert    schedule 26.04.2011    source источник


Ответы (2)


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

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

person Ladislav Mrnka    schedule 26.04.2011
comment
Это отстой. Это означает, что вы должны знать все производные классы заранее. Тогда невозможно добиться слабой связи объекта с EF. - person hyankov; 01.06.2016

Если вам действительно не нужно переопределять некоторые данные или функции по умолчанию, лучше всего вместо этого просто расширить класс. Поскольку классы 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);
      }
   }
}

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

person Karelzarath    schedule 26.04.2011