Linq to SQL datacontext不更新外键关系

我正在针对使用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。 奇怪的是,预先存在的Manifest 确实会附带AllocatedTransactions。 可以使用相同的DataContext对象来插入记录并检索记录吗? 这是L2S的错误吗?

如果我理解你的问题,这是你想要做的吗?

 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实体。 只需像检查newManifest对象一样检索Manifest实体,所有关联的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并假设您尝试添加新记录而不是附加现有记录。