С точки зрения шаблонов вы пытаетесь представить шаблон ActiveRecord , который некоторые люди любят, а некоторые ненавидят. Поэтому вопрос о том, является ли это плохим дизайном, может очень быстро стать религиозным:)
Сказав, что это обычная модель, к сожалению, она не поддерживается EF изначально.
Существует ряд проблем с вашим кодом:
1) ContactInstance не может рассматриваться как контакт, что, как вы, похоже, пытаетесь сделать, в EF, если у вас есть производный тип в CLR (т.е. ContactInstance), он должен соответствовать производному типу в Модель сущности тоже. (т. е. тип сущности с именем ContactInstance), которого, я подозреваю, у вас нет. Я думаю, у вас есть это только для того, чтобы добавить метод Persist. Другой способ сделать это - в частичном классе (EF отлично работает с частичными классами:
public partial class Contact
{
public void Persist(...){}
}
2) Затем в вашем коде есть некоторые проблемы с сущностями, которые могут быть присоединены к нескольким объектным объектам, например, если вы пишете этот код:
Contact c = new Contact();
c.Firstname = ...;
c.Surname = ...;
c.Persist();
c.Surname = ...;
c.Persist();
Это не удастся - во втором вызове Persist () - потому что сущность может быть присоединена только к одному контексту за раз:
- Первый Персист (). добавляет сущность в один контекст.
- И второй Persist () попытается добавить эту же сущность в другой контекст. Время исключения!.
Обходной путь для этого заключается в том, чтобы каким-то образом иметь контекст Ambient, используя что-то наподобие статики ThreadBound или чего-то еще, но тогда вам придется иметь дело со всевозможными хитрыми проблемами.
В любом случае, мораль этой истории в том, что то, что вы пытаетесь сделать, возможно с помощью EF, но это непросто, вы должны действительно продумать такие вещи, как время жизни ObjectContext, такие вопросы, как присоединение / отсоединение и т. Д.
Надеюсь, это поможет
Алекс Джеймс
Бывший член команды EF