我正在针对使用L2S的存储库编写数据库测试。在我的数据库中,我有一个Manifest
实体和一个AllocatedTransaction
实体。 AllocatedTransaction实体具有Manifest id的外键。 DDL看起来像这样:
Manifest:
Id - int - identity
AllocateTransaction:
Id - int - identity
Quantity - int
ManifestId - FK to Manifest
在我的测试中,我正在检查AllocatedTransactions是否与Manifest一起回来。测试看起来像这样:
[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();
}
我的问题是从DataContext返回的Manifest实体没有与之关联的AllocateTransaction。奇怪的是预先存在的清单 做 带回AllocatedTransactions。可以使用相同的DataContext对象来插入记录并检索记录吗?这是L2S的错误吗?
答案 0 :(得分: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);
}
您也无需手动检索与Manifest关联的AllocatedTransaction实体。只需检索Manifest
实体,就像我对newManifest
对象一样,所有关联的AllocatedTransaction
实体都应该跟随。
<强>更新强>
看起来你正试图纠正错误的方向。您需要将AllocatedTransaction附加到Manifest,而不是相反:
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记录都已存在。我强烈建议您不要*预先填充AllocatedTransactions对象中的ManifestID
字段。如果你按照我上面的说明添加它,LINQ引擎将自动解析并更新外键值。如果您提前设置值,它可能会抛弃ChangeSet并假设您正在尝试添加新记录而不是附加现有记录。