Как можно было бы закодировать метод экземпляра сущности для сохранения себя в Entity Framework 4.0? - PullRequest
2 голосов
/ 31 марта 2010

Я работаю с маленькой моделью в Entity Framework 4.0. Я хотел бы иметь метод экземпляра объекта, который представляет сущность, сохранить сущность в базе данных. Так что вместо "внешнего" кода:

public static void Main(string[] args)
{
   using (EFContext ctx = new EFContext())
   {
       context.AnEntitySet.AddObject(refToTheEntityInstance);
       context.SaveChanges();

Вместо этого я хочу, чтобы экземпляр сущности сохранялся сам, где Contact - это имя сущности.

public ContactInstance : Contact
{
    public void Persist(List<AnotherEntity> otherEntityList)
    {
        using (EFContext ctx = new EFContext())
        {
            ...
            ctx.Contacts.AddObject(this); // DOESN'T WORK.
            ...
            ...wire up navigation property to collection of AnotherEntity...
            ctx.SaveChanges();

Я делаю что-то не так. Это плохой дизайн? Мне кажется, что сущность, как и любой объект в объектно-ориентированном проектировании, должна «знать», как сохранить свое существование.

Thabks

Scott

1 Ответ

1 голос
/ 01 апреля 2010

С точки зрения шаблонов вы пытаетесь представить шаблон 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...