2010-02-02 3 views
4

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

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(); 
} 

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

+0

Вызывает ли '_testDataProvider'' SaveChanges() 'в' DataContext', так что 'Manifest' и' AllocatedTransaction' получают свои уникальные идентификаторы? Что произойдет, если вы присоедините новый «манифест» к «AllocatedTransaction», а затем сохраните «AllocatedTransation»? – Jay

+0

'SubmitChanges()' вызывается из '_testDataProvider', а' Manifest' и 'AllocatedTransaction' получают свои идентификаторы. В настоящее время я просто добавляю уникальный идентификатор из «Manifest» при сохранении 'AllocatedTransaction'. Я просто попробовал приложить все «Manifest» и «AllocatedTransaction», как вы сказали, но получил тот же результат. – JChristian

+0

Jay, я думаю, у вас есть это в обратном направлении. На основе образца кода Manifest является родительским объектом, а AllocatedTransaction является дочерним объектом. Вам нужно привязать выделенноеТрансментацию к манифесту, а не наоборот. –

ответ

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 должны следовать.

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(); 

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

+0

По сути, это то, что я пытаюсь сделать, но я не создаю/не представляю «Manifest» и «AllocatedTransactions» одновременно. Я сначала создаю «манифест», отправляя его, а затем создаю и передаю «AllocatedTransaction» с помощью «ManifestId» из существующего «манифест». Я попытался создать «AllocatedTransaction» и приложить к нему «манифест», а затем отправить, как это было предложено в комментариях @Jon, без везения. – JChristian

+0

Спасибо Нейлу, ваше предложение сработало! – JChristian

Смежные вопросы