为什么我的对象没有在linq中更新?

时间:2011-11-25 10:46:27

标签: asp.net linq

我有一个方法,我从DB读取对象,例如:

public Object getProduct(int categoryId, int productId)
{
        DataClassesDataContext db = new DataClassesDataContext(Settings.getDefaultConnectionStringName());

        switch (categoryId)
        {
            case CCategorii.CARTI_ID:
                {
                    IEnumerable<Carti> product = (from c in db.Cartis
                                                  where c.Carti_id == productId
                                                  && c.Vizibil == true
                                                  select c);

                    if (product.Count() != 0)
                        return product.First();

                    break;
                }
           //so on
        }
}

现在我有另一种方法可以进行更新:

public void updateProduct()
{
   Object productToBeUpdated = getProduct(1,1);
    DataClassesDataContext db = new DataClassesDataContext(Settings.getDefaultConnectionStringName());
   //update some properties of the product
   productToBeUpdated.setQuantity(productToBeUpdated.getQuantity()+1);
   db.submitChanges();
}

嗯,该产品是从以前的方法中读取的,但未对数据库进行更改。

我认为原因是我在两个不同的DataContext中执行此READ-UPDATE ... 如果这是原因,您如何威胁这种情况?

哦是的,我可以阅读产品并使用相同的方法进行更新,但这意味着复制我用于阅读的方法并添加更新内容......我想避免这种情况。

5 个答案:

答案 0 :(得分:3)

我认为这是因为您使用不同的上下文进行读写。尝试将DataClassesDataContext变量移动到班级。

答案 1 :(得分:2)

一个选项是:使用公共数据上下文,并将其作为参数传递给getXXX方法:

public Object getProduct(DataClassesDataContext db, int categoryId, int productId)
{
    switch (categoryId)
    {
        case CCategorii.CARTI_ID:
            {
                IEnumerable<Carti> product = (from c in db.Cartis
                                              where c.Carti_id == productId
                                              && c.Vizibil == true
                                              select c);

                if (product.Count() != 0)
                    return product.First();

                break;
            }
       //so on
    }
}

然后:

public void updateProduct()
{
    using (DataClassesDataContext db = new DataClassesDataContext(Settings.getDefaultConnectionStringName()))
    {
       Object productToBeUpdated = getProduct(db, 1,1);
       //update some properties of the product
       productToBeUpdated.setQuantity(productToBeUpdated.getQuantity()+1); // THX @AVD, didn't notice that.
       db.submitChanges();
    }
}

答案 2 :(得分:1)

您正在使用DataContext的两个不同实例。

实现Web应用程序时,最好的选择通常是将DataContext的生命周期与一个http请求的生命周期保持一致。你使用的寿命太短了。

另一种选择是将对象附加到写入DataContext:

db.Cartis.Attach(yourReadObject);
updateProperties(yourReadObject);
db.submitChanges();

修改

好的,您必须先将对象从其他上下文中分离出来。请参阅this article了解如何操作。

但我真的建议使用单个DataContext对象并将生命周期延长到httprequest范围。

对于像autofac这样的ioc容器,这可以做得非常好。

答案 3 :(得分:0)

您不能使用++运算符并使用相同的上下文来更新对象。试试这个,

productToBeUpdated.setQuantity(productToBeUpdated.getQuantity()+1);

答案 4 :(得分:0)

只要您的DataContext超出范围,您的实体就会脱离它。这意味着它不再被您的Context跟踪,也无法保存您对其所做的更改。

您可以共享上下文,以便实体不会脱离您的上下文,或者您可以将其重新附加到第二个上下文(DataContext.Attach