LINQ:在SubmitChanges和Refresh之后,关系不会更新

时间:2011-01-27 15:52:32

标签: c# .net linq datacontext

我发现了一些奇怪的东西。假设我有 Car 模型和公司模型。

所以我的 Car 模型有一个 CompanyId 行。

假设我在 Car CompanyId ,然后我 SubmitChanges > DataContext的

这是我的问题: 我的 Car 模型的 CompanyId 会更新。但 Car.Company 关系不是。

因此,如果我将 Car.CompanyId 1更改为。然后我输出 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();
}

提交我的更改。

5 个答案:

答案 0 :(得分:2)

我认为你的行

  purchaseOrder.SupplierId = supplierItem.Id;

应该更像

  purchaseOrder.Supplier = supplierItem;

只是猜测属性。

您还可能希望在SaveChanges()之后调用purchaseOrder上的dataContext.Refresh()

答案 1 :(得分:1)

仅更改ID还不足以更改关联的公司对象。您需要加载所需的Company对象并将其分配给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();

答案 2 :(得分:1)

不确定这是否是一个可行的选项,但你总是可以选择接收你的查询,包括你想要的相关实体,并附上它,如下所示:

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

dataContext.Attach(purchaseOrders);

答案 3 :(得分:1)

您可能想查看this question的答案。

答案 4 :(得分:0)

尝试在每个操作上打开一个单独的DataContext。理想情况下,任何更新操作都应以SubmitChanges AND结束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();
    } 
}