2011-01-27 116 views
4

我发现了一些奇怪的东西。比方说,我有一个汽车模型和公司模型。LINQ:SubmitChanges和Refresh后没有得到更新

所以我的汽车模型有一个公司Id行。

比方说,我改变的一个汽车CompanyId然后我的SubmitChanges对的DataContext

这里是我的问题: 我的汽车的CompanyId模型得到更新。但Car.Company关系没有。

所以如果我改变Car.CompanyId1到2。然后我输出Car.Company.CompanyId,它会显示1而不是2

所以我的问题是:有没有办法更新DataContext中的所有东西?

我目前使用:

public void RefreshCollection() 
{ 
    // On rafraichit les données à partir de la DB. 
    dataContext.Refresh(RefreshMode.KeepChanges); 

    // On va chercher les données complête de la table. 
    purchaseOrders = from po in dataContext.PurchaseOrders 
        orderby po.PurchaseOrderId ascending 
        select po; 
} 

更新我的收藏。

和:

private void sauvegarderToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    purchaseOrder.OrderDate = orderDate.Value; 
    purchaseOrder.RequiredDate = requiredDate.Value; 
    purchaseOrder.ShipTo = shipTo.Text; 
    purchaseOrder.State = helper.ConvertComboBoxIndexToStateIndex(
     stateKey.SelectedIndex); 

    // On cast un autre type pour le forcer à être un ComboBoxItem 
    var supplierItem = (ComboBoxItem)supplierId.SelectedItem; 
    purchaseOrder.SupplierId = supplierItem.Id; 

    dataContext.SubmitChanges(); 
} 

提交我的变化。

+1

也许如果你发布了一些代码,我们将能够帮助 – 2011-01-27 15:56:40

+0

我看不到我应该发布的代码。问题不是直接在代码中,因为这是非常简单的代码。我只想知道这是否曾发生过别人,如果是,那么该如何解决。 – TomShreds 2011-01-27 16:06:08

+1

我在执行SubmitChanges时遇到了代码,你知道上下文吗?是否附属实体?等 – 2011-01-27 16:08:24

回答

2

我觉得你行

purchaseOrder.SupplierId = supplierItem.Id; 

应该读起来更像

purchaseOrder.Supplier = supplierItem; 

只是猜测性质。

您还可能要调用SaveChanges()

1

之后调用dataContext.Refresh()在purchaseOrder的只是改变了ID是不够的,还改变相关公司对象。您需要加载您想要的公司对象并将其分配给Car.Company。这也将更新Car.CompanyID属性。

喜欢的东西:

var car = context.Cars.First(); // pick your car 
var newCompany = context.Companies.First(); // pick your company 
car.Company = newCompany; 
context.SubmitChanges(); 
1

不知道这是否是一种可行的选择,但你总是有考虑您的查询,包括您需要的相关实体的选项,并附加它,像这样:

purchaseOrders = from po in dataContext.PurchaseOrders.Include("Company") 
        orderby po.PurchaseOrderId ascending 
        select po; 

dataContext.Attach(purchaseOrders); 
0

尝试在每个操作上打开一个单独的DataContext。理想情况下,任何更新操作都应以SubmitChanges结束并关闭DataContext。 DataContext是一个轻量级对象,在这种情况下不应该增加很多开销。例如:

public void RefreshCollection() 
{ 
    using (var dataContext = CreateDataContext()) 
    { 
     // On va chercher les données complête de la table. 
     purchaseOrders = from po in dataContext.PurchaseOrders 
         orderby po.PurchaseOrderId ascending 
         select po; 
    } 
} 

private void sauvegarderToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    using (var dataContext = CreateDataContext()) 
    { 
     purchaseOrder.OrderDate = orderDate.Value; 
     purchaseOrder.RequiredDate = requiredDate.Value; 
     purchaseOrder.ShipTo = shipTo.Text; 
     purchaseOrder.State = helper.ConvertComboBoxIndexToStateIndex(
      stateKey.SelectedIndex); 

     // On cast un autre type pour le forcer à être un ComboBoxItem 
     var supplierItem = (ComboBoxItem)supplierId.SelectedItem; 
     purchaseOrder.SupplierId = supplierItem.Id; 

     dataContext.SubmitChanges(); 
    } 
}