Обновление Linq to SQL не работает с использованием шаблона репозитория - PullRequest
5 голосов
/ 20 ноября 2008

Я использую asp.net mvc для приложения. Я взял некоторые рекомендации из серии Роба Конери на витрине магазина MVC. Я использую шаблон доступа к данным, очень похожий на тот, который он использовал в витрине.

Однако я добавил небольшую разницу в шаблон. Каждый класс, который я создал в своей модели, имеет свойство IsNew. Цель этого - дать мне возможность указать, следует ли мне вставлять или обновлять базу данных.

Вот код:

В моем контроллере:

OrderService orderService = new OrderService();
Order dbOrder = orderService.GetOrder(ID);

if (ModelState.IsValid)
{
    dbOrder.SomeField1 = "Whatever1";
    dbOrder.SomeField2 = "Whatever2";
    dbOrder.DateModified = DateTime.Now;
    dbOrder.IsNew = false;

    orderService.SaveOrder(dbOrder);
}

И затем в SQLOrderRepository:

public void SaveOrder(Order order)
{
    ORDER dbOrder = new ORDER();

    dbOrder.O_ID = order.ID;
    dbOrder.O_SomeField1 = order.SomeField1;
    dbOrder.O_SomeField2 = order.SomeField2;
    dbOrder.O_DateCreated = order.DateCreated;
    dbOrder.O_DateModified = order.DateModified;

    if (order.IsNew)
        db.ORDERs.InsertOnSubmit(dbOrder);

    db.SubmitChanges();
}

Если я изменю код контроллера так, чтобы dbOrder.IsNew = true; тогда код работает, и значения вставляются правильно.

Однако, если я установлю dbOrder.IsNew = false; тогда ничего не происходит ... ошибок нет - просто не обновляется порядок.

Я использую DebuggerWriter здесь: http://www.u2u.info/Blogs/Kris/Lists/Posts/Post.aspx?ID=11 для отслеживания генерируемого SQL, и, как и ожидалось, когда значение IsNew равно true, SQL вставки генерируется и выполняется правильно. Однако если для параметра IsNew задано значение false, SQL не создается, поэтому ничего не выполняется.

Я подтвердил, что проблема здесь ( LINQ не обновляется .SubmitChanges () ) не является проблемой.

Любая помощь приветствуется.

Ответы [ 3 ]

7 голосов
/ 20 ноября 2008

В вашем методе SaveOrder вы всегда создаете новый объект ORDER. Вам нужно изменить это так, чтобы, если order.IsNew был ложным, он извлекал существующий из БД и обновлял его.

public void SaveOrder(Order order)
{
    ORDER dbOrder;
    if (order.IsNew)
    {
        dbOrder = new ORDER();
        dbOrder.O_ID = order.ID;
    }
    else
    {
        dbOrder = (from o in db.ORDERS where o.O_ID == order.ID select o).Single();
    }

    dbOrder.O_SomeField1 = order.SomeField1;
    dbOrder.O_SomeField2 = order.SomeField2;
    dbOrder.O_DateCreated = order.DateCreated;
    dbOrder.O_DateModified = order.DateModified;

    if (order.IsNew)
        db.ORDERs.InsertOnSubmit(dbOrder);

    db.SubmitChanges();
}
1 голос
/ 21 ноября 2008

То, что сказал tvanfosson.

Я просто хотел бы добавить, что я использую логику, где, если Id равен по умолчанию (0 или Пусто, если используются направляющие), то я предполагаю, что это новое. В противном случае, если мне передан идентификатор, тогда я возьму существующий объект и обновлю его.

1 голос
/ 20 ноября 2008

Я думаю, у вас проблема в том, что ваша сущность отделена от вашего контекста.

Вы должны попытаться присоединить вашу сущность обратно к вашему контексту, если вы хотите обновить. Недостатком LINQtoSQL является то, что для повторного вложения вам понадобится исходное состояние объекта, когда он был отсоединен ...

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

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