2012-03-26 2 views
5

Я создал модель данных сущности и сгенерировал из нее базу данных.Производя из классов, созданных Entity Framework в C#

Одно из объектов называется Template.

Созданные частичные классы для расширения функциональности Template отлично работают.

Если я создаю новый класс и попытаться вывести из Template, я получаю исключение во время выполнения на инстанцировании:

Mapping and metadata information could not be found for EntityType 'Template001'.

Как я могу обойти это? Мне определенно нужно наследовать классы EF.

EDIT

ли, кажется, не представляется возможным. Если это так, то каким будет лучший способ реализовать следующее требование: объект шаблона хранит информацию о шаблонах, каждая из которых имеет свой собственный код для выполнения. Вот почему я пытался извлечь из себя сущность в первую очередь.

+0

Отметьте [это] (http://stackoverflow.com/questions/2350514/ef-mapping-and-metadata-information-could-not-be-found-for-entitytype-error) и [это] (http://stackoverflow.com/questions/2247891/metadata-information-not-found-while-using-ef4s-poco-template) ВОПРОСЫ. – Attila

+0

Какой «свой собственный код» вы имеете в виду и как EF понимает разницу между «context.Template1s.Load()» или «context.Template2s.Load()», когда вся база данных имеет 'template'? Не могли бы вы привести пример того, как вы собираетесь использовать это? – hvd

+0

@Attila: Спасибо. В первой ссылке упоминалось, что EF не поддерживает Enums, который случайно использовал в частичном классе, но удаление этого тоже не сработало. Пока кажется, что нет решения, кроме композиции. Есть предположения? –

ответ

4

Почему вам нужно наследовать от класса сущности в первую очередь? Если вы хотите добавить какое-то простое поведение, используйте частичный класс.

Обновление: Основываясь на комментариях, представляется, что существует вероятность того, что по прошествии времени поведение будет расширено. В этом случае я бы рекомендовал использовать состав/агрегацию, а не наследование. Пусть классы, которые должны быть расширены, имеют сущность как поле. В сценарии Рахеля это будет класс под названием TemplateLogic с полем/свойством типа Template.

+0

Сценарий трудно объяснить, но в основном каждый производный класс будет реализовывать пользовательские функции, которые будут добавлены в базу кода с течением времени. Сама сущность просто запоминает, какой тип производного класса должен использоваться для обработки. –

+4

Тогда просто используйте композицию, а не наследование. Пусть классы, которые должны быть расширены, имеют сущность как ее поле. В вашем сценарии у вас будет класс под названием TemplateLogic с полем/свойством типа Template. –

+0

Спасибо. Это немного усложнит код, но определенно будет работать. Если я скоро не найду ответ в наследстве, я закончу это. –

5

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

+0

Я не могу сопоставить производные классы, так как они не используются для сохранения. Они созданы для реализации функций в зависимости от данных базового объекта. –

+0

Нет, это не так. Если вы получаете сущность и используете ее либо для получения данных из базы данных, либо для сохранения данных в базе данных, она используется для сохранения, и вы также должны отображать производный класс. Если вы не можете сопоставить его, это означает, что ваше наследование используется неправильно, и вы должны использовать композицию, предложенную @Sergey. –