Entity Framework 3.5 - как обновить строку без предварительной загрузки из базы данных - PullRequest
3 голосов
/ 31 июля 2011

Это мой текущий код для обновления поля в базе данных

private void SaveUser(User user)
{
   USER UserObj = _db.USERs.First(i => i.USER_ID == user.USER_ID);
   UserObj.NAME = user.NAME;
   _db.SaveChanges();
}

Это отлично работает.Однако я хочу изменить две вещи

1) Могу ли я сначала пропустить загрузку строки из БД?то есть эта строка USER UserObj = _db.USERs.First(i => i.USER_ID == user.USER_ID);

2) Если есть 20 полей для обновления, как я могу установить их все сразу?Или мне придется самому написать все 20 заданий?

Спасибо

Ответы [ 4 ]

5 голосов
/ 31 июля 2011

Редактировать - образцы, измененные для EFv1 - он отвечает на оба ваших вопроса:

Вы ищете это:

private void SaveUser(User user)
{
    // Attach dummy entity - it must have only primary key property and EntityKey 
    // property assigned
    _db.USERs.Attach(new User() { ... });
    // Apply current values to dummy entity - this will mark the entity as modified
    // and it will also mark all properties (except key and store generated) as modified
    _db.ApplyPropertyChanges("UserSetName", user);
    _db.SaveChanges();
}

Существует некоторая разница между EntityObject s (в настоящее время в основном устарели) и POCO (только EFv4), где POCO просто обновляется, если оно помечено как измененное, но EntityObject нет.Он будет обновляться только в том случае, если свойства отличаются от своего исходного состояния или если свойство установлено вручную как измененное в ObjectStateEntry.

Выборочное определение того, какие свойства должны быть обновлены, аналогично назначению их вручную:

private void SaveUser(User user)
{
    _db.USERs.Attach(user);
    ObjectStateEntry entry = _db.ObjectStateManager.GetObjectStateEntry(user);
    entry.SetModifiedProperty("PropertyName");
    // set other properties
    _db.SaveChanges();
}

Кстати.Вы слышали о соглашениях об именах?

0 голосов
/ 31 июля 2011
  1. Если вы хотите обновить материал без предварительной загрузки его из БД, вам нужно будет создать хранимую процедуру и сопоставить ее с вашим контекстом (или использовать что-то совершенно отличное от Entity Framework).

  2. Если вы извлекаете объект из базы данных и обновляете 20 полей перед вызовом SaveChanges(), все изменения будут сброшены в базу данных в одной транзакционной операции, поэтому онибудет существенно обновляться "все сразу".

0 голосов
/ 31 июля 2011

для первой части вашего вопроса проверьте this , он делает то, что вам нужно, но вы должны знать первичный ключ объекта, который вы обновите

для второй части, которую вы должныСообщите вашему контексту, какую сущность вы будете обновлять и какие поля (свойства) будут назначены с новыми значениями, но самое интересное, что вы попали в базу данных только один раз, чтобы запустить свои обновления, вызвав SaveChanges() method

0 голосов
/ 31 июля 2011

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

Это не был твой вопрос, но я подумал, что стоит указать (что это нормально и нормально брать из БД). Если вы не хотите извлекать данные из базы данных, я уверен, что вы можете написать специальный запрос, но, возможно, не через Entity Framework. В части 2 я не вижу способа обновить 20 полей, не сообщая EF, что это за 20 полей. Это должно знать, что это собирается обновить на некотором уровне.

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

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