2014-02-11 1 views
1

Я пытаюсь сделать что-то, что должно быть «простым», я хочу вытащить часть данных из моей базы данных, но я хочу только вытащите описание (таблица базы данных для этого элемента имеет имя, фамилию, адрес и т. д.).Entity framework выбирает существующий элемент и только оттягивает одно из его полей для обновления

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

Вот мой код, который я пытаюсь исправить

using (var context = new storemanagerEntities()) 
     { 
      var stock = context.stocks.Where(x => x.id == model.Id).Select(
       x => new stock() 
       { 
        description = x.description 
       }).FirstOrDefault(); 

      stock.description = model.Description; 

      context.SaveChanges(); 
     } 

Ошибки Я ловя это

**The entity or complex type 'StoreManagerModel.stock' cannot be constructed in a LINQ to Entities query.** 

Я уверен, что с помощью «нового» ключевого слова, вероятно, проблема , но есть ли у кого-нибудь идеи о том, как это решить?

--update

Этот код работает, но это не похоже на самом деле обновить базу данных

public void UpdateDescription(StockItemDescriptionModel model) 
    { 
     using (var context = new storemanagerEntities()) 
     { 
      var stock = context.stocks.Where(x => x.id == model.Id) 
       .AsEnumerable() 
       .Select(
       x => new stock 
       { 
        description = x.description 
       }).FirstOrDefault(); 

      stock.description = model.Description; 
      context.SaveChanges(); 
     } 

    } 

На данный момент это, казалось бы, это, возможно, мой водитель MySQl который 6390, кажется, для работы в другой версии, я попробовал, жаль, что я еще не нашел ответ

+0

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

+0

Ну лаг всегда является проблемой, но мне все же хотелось бы получить ответ, поскольку я чувствую, что мой код будет намного опрятным – Canvas

+0

Что касается ваша ошибка, вы пытаетесь создать не отслеживаемый тип внутри (для всех целей и задач) SQL-запроса. Вам нужно превратить Linq-To-SQL в Linq-To-Entities с помощью '.ToList()' после вашего '.Where' call –

ответ

0

Вы не можете проецировать отображаемый тип объекта во время запроса L2E, вам нужно будет переключить контекст обратно на L2F. Для обеспечения оптимальной производительности рекомендуется использовать AsEnumerable по номеру ToList, чтобы избежать слишком раннего изложения запроса.

var stock = context.stocks.Where(x => x.id == model.Id) 
    .AsEnumerable() 
    .Select(x => new stock 
    { 
     description = x.description 
    }) 
    .FirstOrDefault(); 

Как к вашим конкретным проблемам, выше не позволит вам сделать это, как это потому, что вы эффективно создали неотслеживающую сущности. Для того, чтобы EF, чтобы понять, как подключить объект к вашей БД вам нужно будет прикрепить его к контексту - это потребовало бы, чтобы вы также спустить Id в сущности, хотя т.е.

Select(x => new stock 
    { 
     id = x.id, 
     description = x.description 
    }) 
    ... 
    context.stocks.Attach(stock); 
    stock.description = model.Description; 
    context.SaveChanges(); 
+1

Строго говоря, вы можете проектировать в запросе L2E, просто не используя не отслеживаемый/сложный тип (т.е. класс), но вы можете проецировать на анонимные классы. –

+0

@DanPantry вы можете проектировать на сложный тип, вы просто не можете проект на сопоставленный тип объекта. Я уточнил свой ответ, чтобы быть более конкретным. – James

+0

Я пробовал это, и я получаю эту ошибку при попытке доступа к запасу .description = model.description Ссылка на объект не установлена ​​в экземпляр объекта – Canvas

1

Вы можете сделать это даже без получения какого-либо объекта из базы данных пути создания незавершенной объект:

context.Configuration.ValidateOnSaveEnabled = false; 

// Create stub entity: 
var stock = new stock { id = model.Id, description = model.Description }; 

// Attach stub entity to the context: 
context.Entry(stock).State = System.Data.Entity.EntityState.Unchanged; 

// Mark one property as modified. 
context.Entry(stock).Property("description").IsModified = true; 

context.SaveChanges(); 

проверки при сохранении выключена, в противном случае EF проверит незавершенную объект, который, скорее всего, не потому, что это, возможно, требуемые свойства без значений.

Конечно, может быть разумно проверить, существует ли сущность вообще в базе данных, но это можно сделать по дешевому запросу Any().

Смежные вопросы