【问题标题】:LINQ: Relations do not get updated after SubmitChanges and RefreshLINQ:关系在 SubmitChanges 和 Refresh 后没有更新
【发布时间】:2011-06-16 15:44:39
【问题描述】:

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

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

假设我更改了 CarCompanyId,然后我在 SubmitChanges >数据上下文

这是我的问题: 我的 Car 模型的 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();
}

提交我的更改。

【问题讨论】:

  • 也许如果您发布一些我们将能够提供帮助的代码
  • 我看不到我应该发布什么代码。问题不直接在代码中,因为这是非常简单的代码。我只是想知道这是否发生在其他人身上,如果发生了,那么如何解决它。
  • 我在您执行 SubmitChanges 时遇到了代码,您知道上下文吗?实体是否附加?等
  • 我用 SubmitChanges 添加了代码。 PurchaseOrder 实体与 Supplier 实体相关。如果这就是你的意思。谢谢:)

标签: c# .net linq datacontext


【解决方案1】:

我觉得你的台词

  purchaseOrder.SupplierId = supplierItem.Id;

应该更像

  purchaseOrder.Supplier = supplierItem;

只是猜测属性。

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

【讨论】:

  • 感谢您的回答,我认为这是朝着好方法迈出的一步,但我收到外键错误:尝试删除 PurchaseOrder 和供应商之间的关系。但是,不能将关系的外键之一 (Supplier.SupplierId) 设置为 null。 :\有什么想法吗?
  • 看你是怎么得到purchaseOrder的,貌似填了一个新的但是怎么创建的呢?此外,supplierItem 应由相同的上下文等跟踪。
  • purchaseOrder 是从 LINQ 查询加载的,供应商也是如此。 PurchaseOrder 已链接到另一个供应商,我更改了它,现在我收到 FK 错误。两个事务使用相同的上下文。谢谢:)
【解决方案2】:

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

【讨论】:

  • @Tom:仅供参考,您必须单击赏金奖励图标才能实际奖励赏金。谢谢!
【解决方案3】:

仅更改 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();

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 如果实体来自 dataContext 他们已经附加到它。
    • 但如果Include 方法包含新实体,那么您是对的
    【解决方案5】:

    尝试在每个操作上打开一个单独的 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();
        } 
    }
    

    【讨论】:

    • -1。虽然数据上下文的生命周期确实应该尽可能短,但简单地说您应该为每个操作创建一个新的上下文太简单了。只要要对实体进行更改跟踪,上下文就必须存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多