0

我正在使用以下代码保存一个 Order 对象:

public void SaveOrder (string orderNo)
{
    using (var se = new StoreEntities)
    {
        var order = new Order { OrderNumber = orderNo }

        try
        {
            //// Update
            if (se.Orders.Any(e => e.OrderNumber == orderNo))
            {
                se.Orders.Attach(order);
                se.ObjectStateManager.ChangeObjectState(order, EntityState.Modified);
            }
            //// Create
            else
            {
                se.Orders.AddObject(order);
            }
            se.SaveChanges();
        }
        catch (OptimisticConcurrencyException){
            se.Refresh(RefreshMode.ClientWins, order);
            se.SaveChanges();
        }
    }
}

当它是一个新订单并且我只是插入数据库时​​,这很好用。但是,如果我尝试更新现有订单,我会收到他的错误:

由于在商店中找不到以下对象,因此未刷新它们:“EntitySet=Orders;OrderID=0”。

在数据库中,Order 表看起来像

OrderID | OrderNumber
13        567-87
15        567-93

其中 OrderID 是一个身份键。除了这两行之外没有其他行,因为它们已被删除。

我做错了什么,我无法更新记录?

4

1 回答 1

1

看起来您收到错误是因为您正在附加Order您创建的新对象,就好像它Order已经存在一样 - 这就是OrderID错误中的原因为零的原因。

试试这个:

try
{
    //// Update
    var existingOrder = se.Orders.FirstOrDefault(e => e.OrderNumber == orderNo);

    if (existingOrder != default(Order))
    {
        existingOrder.DateLastUpdated = DateTime.Now;
        se.ObjectStateManager.ChangeObjectState(existingOrder, EntityState.Modified);
    }
    //// Create
    else
    {
        se.Orders.AddObject(order);
    }
    se.SaveChanges();
}

编辑

您可以逐个属性地更新订单详细信息,或者如果您有一个Order(或一个OrderViewModel,也许是)包含要更新的详细信息,您可以使用AutoMapper之类的东西为您复制值。

于 2013-01-17T21:50:09.630 回答