Linq to SQL更新无法使用Repository模式

时间:2008-11-20 07:36:33

标签: asp.net-mvc linq linq-to-sql

我正在使用asp.net mvc作为应用程序。我从Rob Conery的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时,生成并正确执行Insert SQL。但是,当IsNew设置为false时,似乎没有生成SQL,因此不执行任何操作。

我已经确认此处的问题(LINQ not updating on .SubmitChanges())不是问题。

感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

在SaveOrder方法中,您始终创建一个新的ORDER对象。您需要对此进行更改,以便在order.IsNew为false时,它会从数据库中检索现有的并更新它。

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 :(得分:1)

我认为你的问题是你的实体脱离了你的背景。

如果要更新,则应尝试将实体附加回上下文。 LINQtoSQL的缺点是,对于重新附加,你需要在分离时对象的原始状态......

另一种解决方案是从上下文中重新获取实体,并从参数中复制实体中的所有数据。这将一直持续到你将拥有更复杂的实体。

答案 2 :(得分:1)

tvanfosson说。

我想补充一点,我使用逻辑,如果Id等于默认值(如果使用guids则为0或空),然后我认为它是新的。否则,如果我传入了id,那么我将获取现有对象并更新它。