我有一个方法,我从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 ... 如果这是原因,您如何威胁这种情况?
哦是的,我可以阅读产品并使用相同的方法进行更新,但这意味着复制我用于阅读的方法并添加更新内容......我想避免这种情况。
答案 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)