LINQ: отношения не обновляются после SubmitChanges и Refresh - PullRequest
4 голосов
/ 27 января 2011

Я нашел что-то странное. Допустим, у меня есть модель Car и модель Company .

Итак, моя модель Car имеет строку CompanyId .

Допустим, я меняю Автомобиль CompanyId , затем я SubmitChanges на DataContext .

Вот моя проблема: CompanyId моей Car модели обновляется. Но отношение Car.Company НЕ имеет.

Поэтому, если я изменю Car.CompanyId с 1 на 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();
}

Чтобы отправить мои изменения.

Ответы [ 5 ]

2 голосов
/ 27 января 2011

Я думаю, что ваша линия

  purchaseOrder.SupplierId = supplierItem.Id;

должен читать больше как

  purchaseOrder.Supplier = supplierItem;

Просто угадал свойства.

Возможно, вы захотите вызвать dataContext.Refresh () для purchaseOrder после SaveChanges ()

1 голос
/ 08 февраля 2011

Вы можете проверить ответы на этот вопрос .

1 голос
/ 06 февраля 2011

Не уверен, что это приемлемый вариант, но у вас всегда есть возможность принять свой запрос, включая связанные с ним объекты, которые вы хотите, и прикрепить его, например, так:

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

dataContext.Attach(purchaseOrders);
1 голос
/ 02 февраля 2011

Простого изменения идентификатора недостаточно, чтобы также изменить связанный объект Company. Вам необходимо загрузить нужный объект 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();
0 голосов
/ 07 февраля 2011

Попробуйте открыть отдельный 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();
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...