Внесение изменений в базу данных с использованием Entity Framework - PullRequest
5 голосов
/ 18 октября 2011

У меня есть ситуация, когда я извлекаю данные из таблицы по дате. Если данные на указанную дату не предоставлены, я создаю запись, используя значения по умолчанию, и отображаю ее для пользователя. Когда пользователь закончил манипулировать данными, мне нужно зафиксировать изменения.

Поэтому мой вопрос заключается в том, как мне обработать в Entity Framework отправку таблицы, в которой могут быть как обновления, так и добавления, которые необходимо выполнить. Это в C # с использованием MVC3 и Entity Framework.

Итак, вот как могут выглядеть данные для начала,

Таблица A

NAME  AGE PHONE_NUM 
Jim   25  555-555-5555 
Jill  48  555-551-5555

После того, как пользователи покончили с данными, это может выглядеть так:

Таблица A

NAME  AGE PHONE_NUM
Jim   25  555-555-5555
Jill  28  555-551-5555
Rob   42  555-534-6677

Как мне зафиксировать эти изменения? Моя проблема в том, что нужны как обновления, так и вставки?

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

Для добавления строк данных

entities.TABlEA.AddObject(TableOBJECT);
entities.SaveChanges();

или для обновления данных

entities.TABLEA.Attach(entities.TABLEA.Single(t => t.NAME == TableOBJECT.NAME));
entities.TABLEA.ApplyCurrentValues(TableOBJECT);
entities.SaveChanges();

Будет ли что-нибудь из этого работать или мне нужно отслеживать, что там и что было добавлено?

Идеи

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Более или менее у вас уже есть решение. Вам просто нужно проверить, имеет ли ваш Single вызов, который пытается загрузить объект из БД, результат или нет (используйте вместо него SingleOrDefault). Если результат null, необходимо вставить, в противном случае обновить:

foreach (var TableOBJECT in collectionOfYourTableOBJECTsTheUserWorkedWith)
{
    var objectInDB = entities.TABLEA
        .SingleOrDefault(t => t.NAME == TableOBJECT.NAME);
    if (objectInDB != null) // UPDATE
        entities.TABLEA.ApplyCurrentValues(TableOBJECT);
    else // INSERT
        entities.TABLEA.AddObject(TableOBJECT);
}
entities.SaveChanges();

(я предполагаю, что NAME - это свойство первичного ключа вашей TableOBJECT сущности.)

0 голосов
/ 18 октября 2011

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

Другим решением будет использование самопроверяющихся объектов Entity Framework, но я не думаю, что это правильное направление длявеб-приложение (возможно, оно находится в распределенном приложении WCF).

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