Текст данных Linq to SQL не обновляется для внешних ключей - PullRequest
4 голосов
/ 03 февраля 2010

Я пишу тест базы данных для репозитория, который использует L2S.В моей базе данных есть сущность Manifest и сущность AllocatedTransaction.Сущность AllocatedTransaction имеет внешний ключ для идентификатора манифеста.DDL выглядит примерно так:

Manifest:
Id - int - identity

AllocateTransaction:
Id - int - identity
Quantity - int
ManifestId - FK to Manifest

В моем тесте я проверяю, возвращаются ли AllocatedTransactions с Манифестом.Тест выглядит следующим образом:

[TestMethod]
public void FindByIdTest()
{
    using (data.EZTracDataContext dataContext = new data.EZTracDataContext())
    {
        using (new TransactionScope())
        {
            data.Manifest manifest = _testDataProvider.AddManifest(dataContext);

            data.AllocatedTransaction allocatedTransaction = _testDataProvider.AddEligibilityAllocated(dataContext, 5, manifest.Id);

            ManifestRepository repository = CreateRepository(dataContext);

            var actual = repository.FindById(manifest.Id).AllocatedTransactions;
            var expected = new[] { new domain.AllocatedTransaction(allocatedTransaction.Id, 5, manifest.Id) }.ToList();

            CollectionAssertAreEqual(actual, expected);
        }
    }
}

_testDataProvider просто добавляет записи в базу данных, используя переданный в dataContext.Метод FindById выглядит следующим образом:

public domain.Manifest FindById(int id)
{
    var persistedManifest = GetPersistedManifest(id);
    var requestedManifest = GetDomainManifestFromData(persistedManifest);
    return requestedManifest;
}

private Manifest GetPersistedManifest(int manifestId)
{
    return (from manifests in DataContext.Manifests
            where manifests.Id == manifestId
            select manifests).FirstOrDefault();
}

Моя проблема заключается в том, что объект Manifest, возвращаемый из DataContext, не имеет связанной с ним AllocateTransaction.Странно то, что существовавшие ранее манифесты do возвращаются с прикрепленными AllocatedTransactions.Может ли это быть причиной использования одного и того же объекта DataContext для вставки записей и их извлечения?Это ошибка с L2S?

1 Ответ

1 голос
/ 03 февраля 2010

Если я понимаю ваш вопрос, это то, что вы пытаетесь сделать?

using (new TransactionScope())
{
    Manifest manifest = new Manifest
    {
        AllocatedTransactions.Add(new AllocatedTransaction
        {
            Quantity = 5
        }
    };

    DataContext.Manifests.InsertOnSubmit(manifest);
    DataContext.SubmitChanges();

    Manifest newManifest = DataContext.Manifests.Where(a => a.ID == manifest.ID).SingleOrDefault(); 

    Assert.AreEqual(manifest.AllocatedTransactions.First().Quantity, newManifest.AllocatedTransactions.First().Quantity);
}

Вам также не нужно вручную извлекать сущности AllocatedTransaction, связанные с манифестом. Просто извлеките сущность Manifest, как я это сделал с объектом newManifest, и все связанные с ней сущности AllocatedTransaction должны последовать.

UPDATE:

Похоже, вы пытаетесь присоединиться в неправильном направлении. Вам необходимо прикрепить AllocatedTransaction к манифесту, а не наоборот:

Manifest manifest = DataContext.Manifests.Single(a => a.ID == 27);
AllocatedTransaction allTrans = DataContext.AllocatedTransactions.Single(a => a.ID == 53);

manifest.AllocatedTransactions.Add(allTrans);
DataContext.SubmitChanges();

Предполагается, что записи Manifest и AllocatedTransaction уже существуют. Я настоятельно рекомендую вам ** не * предварительно заполнять поле ManifestID в объекте AllocatedTransactions. Если вы добавите его, как я продемонстрировал выше, механизм LINQ автоматически разрешит и обновит значение внешнего ключа. Если вы установите значение заранее, он может сбросить набор изменений и предположить, что вы пытаетесь добавить новую запись, а не присоединить существующую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...