Текст данных Linq to SQL не обновляется для внешних ключей
Я пишу тест базы данных для репозитория, который использует 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. Странно то, что уже существующие Манифесты возвращаются с прикрепленными AllocatedTransaction. Может ли это быть причиной использования одного и того же объекта DataContext для вставки записей и получения записей? Это ошибка с L2S?
1 ответ
Если я понимаю ваш вопрос, это то, что вы пытаетесь сделать?
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
сущности должны следовать вместе.
ОБНОВИТЬ:
Похоже, вы пытаетесь присоединиться в неправильном направлении. Вам нужно прикрепить 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 автоматически разрешит и обновит значение внешнего ключа. Если вы установите значение заранее, он может сбросить набор изменений и предположить, что вы пытаетесь добавить новую запись, а не присоединить существующую.