Как установить это из Entity Framework, используя Linq - PullRequest
0 голосов
/ 02 декабря 2011

Некоторое время назад я попал в ловушку жирного контроллера, когда впервые работал с MVC.Мое первое приложение использовало EF4 для создания всех нужных мне моделей.Я просто вложил всю свою логику в свои действия контроллера.Хотя это сработало, это определенно не лучший способ практики.Чтобы сделать это правильно, я начал пытаться строить свои модели на основе своих объектов EF, пытаясь следовать концепции «тощего» контроллера.

Я столкнулся с препятствием на пути поиска наилучшего способа заполнениямои модели.Есть ли способ выполнить запрос LINQ и заполнить вашу модель без необходимости перебирать свойства, чтобы установить другой класс?

Примерно так:

// from EF model built from database
public class MyEFObject
{
    public int ID {get; set;}
    public string Name {get; set;}
    public string Title {get; set;}
}

public class MyObjectModel : MyEFObject
{
    private Entities _data = new Entities();
    public MyObjectModel(int? id)
    {
        if(id.HasValue) // get an existing record
        {
           this = _data.MyEFObjects.Where(m => m.ID.Equals(id)).Single();
           // or populate right out of the query
           _data.MyEFObjects.Where(m => m.ID.Equals(id))
                         .Select(o => new {
                            this.ID = o.ID,
                            this.Name = o.Name,
                            this.Title = o.Title
                          }); 
        }
        else
        {
           // set defaults for a new MyObjectModel
        }  
    }

    public void Save()
    {
        // takes the current object and saves changes
    }
}

Я вас знаюЯ могу добавить функцию к объекту EF Entity, но мне нравится иметь возможность создавать или обновлять все, связанные за один вызов (метод Save).Я не вижу смысла возиться с моделью, если мне нужно по существу воссоздать то, что у меня уже есть, из моего объекта EF.Если у меня просто есть метод в классе, который принимает заполненный объект, концепция полезной модели для моих представлений сводится на нет.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Слаума прав.LINQ to Entities не примет это.Я попробовал несколько версий того, что было опубликовано, и я нашел себя только с грязным беспорядком.Я дошел до того, что смог установить значения экземпляров, но к тому времени EF уже не регистрировал внесенные изменения, и это побеждало всю цель.Возможно, есть способ сделать это, но на данный момент шаги, чтобы заставить его работать, кажутся излишними.

У меня получилось что-то вроде этого:

public class MyObjectModel : MyEFObject
{
    public void Save(int? id, MyObjectModel model)
    {
       var data = new Entities();
       MyEFObject foo;
       if(id.HasValue)
       {  
           foo = data.MyEFObjects.Where(e => e.ID.Equals(id.Value)).Single();
       }
       else
       {
           foo = new MyEFObject();
       }
       foo.Name = model.Name; 
       foo.Title = model.Title;

       if(!id.HasValue)
       {
          data.MyEFObjects.AddObject(foo);
       }

       data.SaveChanges();
    }
}

Я не хотел работать с двумя экземплярами моей модели, но она работает, и у меня есть действие Lean Controller.

0 голосов
/ 02 декабря 2011

То, что вы могли бы сделать, - это модель домена, модель ef и адаптер . Я думаю, что это делает код довольно чистым и хорошо разделяет логику отображения.

//Domain model to decouple from EF
public class MyObjectModel
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public string Title {get; set;} 
} 

//Auto generated Entity Framework class
public class MyEFObject
{ 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public string Title {get; set;} 
} 

//Adapter responsible for mapping your data to your domain model
public class MyObjectModelAdapter : MyEFObject
{
    public MyObjectModelAdapter(MyEFObject entity)
    {
        if(entity != null)
        {
            this.ID = entity.ID;
            this.Name = entity.Name;
            this.Title = entity.Title;
        }
        else 
        { 
           // set defaults for a new MyObjectModel 
        }  
    }
}

Тогда основное использование будет:

new Entities().MyEFObjects.ToList().Select(x => new MyObjectModelAdapter(x));

OR

new MyObjectModelAdapter(new Entities().MyEFObjects.FirstOrDefault(x => x.ID.Equals(objectId)));

Если вам конкретно требуется список MyObjectModel, вы можете сделать следующее:

new Entities().MyEFObjects.ToList().Select(x => new MyObjectModelAdapter(x) as MyObjectModel);

OR

new MyObjectModelAdapter(new Entities().MyEFObjects.FirstOrDefault(x => x.ID.Equals(objectId)) as MyObjectModel;

Конечно, вы не хотите связывать свой контекст сущности таким образом, это просто для демонстрации использования.

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