2015-06-04 2 views
0

Я использую Entity Framework в проекте с участием TV Series. Данные загружаются загрузкой файлов эпизодов. Когда я создаю Эпизод, он должен найти серию, к которой она принадлежит, и использовать ее, или создать новую.Entity Framework 6 Создание единственной связанной записи

Я использую «EpisodeFactory» для создания Эпизодов, и он работает до тех пор, пока я не сохраню, а затем создаст новую серию для каждого эпизода.

Ищу:

  • серии: Id = 01, Name = 'Gotham'
  • Эпизод: Id = 21, имя = 'GothamS01E01', серия = 01
  • Эпизод: Id = 22, имя = 'GothamS01E02', серия = 01

Что я Ge чал:

  • Серия: Id = 01, Name = 'Gotham'
  • Серия: Id = 02, имя = 'Gotham'
  • Серия: Id = 03, Name = 'Gotham'
  • Эпизод: Id = 21, имя = 'GothamS01E01', серия = 02
  • Эпизод: Id = 22, Name = 'GothamS01E02', серия = 03

Вот мой UnitTest для этого:

[Test] 
    public void ShouldLoadSeriesIfOneExists() 
    { 
     const string testDirectory = TestContstants.TestDir + @"\ShouldLoadSeriesIfOneExists"; 
     var episodeFactory = new EpisodeFactory(); 
     var randomSeriesName = Guid.NewGuid().ToString(); 
     var testEpisodeA = episodeFactory.createNewEpisode(testDirectory + @"\" + randomSeriesName + @"S01E01.avi"); 
     var testEpisodeB = episodeFactory.createNewEpisode(testDirectory + @"\" + randomSeriesName + @"S02E03.avi"); 

     using (var dbContext = new MediaModelDBContext()) 
     { 
      dbContext.Episodes.Add(testEpisodeA); 
      dbContext.Episodes.Add(testEpisodeB); 
      dbContext.SaveChanges(); 

      Assert.That(dbContext.Series.Count(s => s.SeriesName == randomSeriesName), Is.EqualTo(1)); 

      dbContext.Series.Remove(testEpisodeA.Series); 
     } 
    } 

EpisodeFactory получить имя файла и извлекает информацию Эпизод из файла.

серии забирается с:

public Series GetSeriesBySeriesName(string seriesName) 
    { 
     using (var dbContext = new MediaModelDBContext()) 
     { 
      if (dbContext.Series.Any()) 
      { 
       var matchingSeries = dbContext.Series.FirstOrDefault(series => series.SeriesName == seriesName); 
       if (matchingSeries != null) return matchingSeries; 
      } 

      var seriesByShowName = new Series(){SeriesName = seriesName}; 
      dbContext.Series.Add(seriesByShowName); 
      dbContext.SaveChanges(); 
      return seriesByShowName; 
     } 
    } 

и соответствующей модели:

public class Episode 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] 
    public virtual int EpisodeId { get; set; } 
    public virtual Series Series { get; set; } 

    // ... 

} 

public class Series 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity), Key] 
    public int SeriesId { get; set; } 
    public string SeriesName { get; set; } 
    public ObservableCollection<Episode> Episodes { get; set; } 

    public Series() 
    { 
    } 

    // ... 
} 
+0

Я не могу полностью понять ваш вопрос, не могли бы вы рассказать подробнее? – adricadar

+0

Проблема должна быть в вашем Factory.После создания серии (1 запись) и вызова SaveChanges() вы получите идентификатор для своей серии, и вы можете использовать его в своем объекте Episode. Второй возможный выбор - создать запись Serie без SaveChanges() и присвоить этот объект обоим вашим Eposides. Если вы создаете два разных объекта, которые не ссылаются на DbContext, DbContext создает две новые записи для каждого Eposide. –

+0

Я не уверен, почему у вас есть фабрика для ваших сущностей, я мог бы это понять, если бы у вас был один для вашего dbContext ..., если у вас есть логика, которая создает вашу сущность, тогда вы можете иметь это в классе сущности. –

ответ

0

Делитесь ли вы тот же DbContext Instance в тесте и фабрики? Если это не проблема, вы используете разные экземпляры DBContext в своем заводском методе и в своем тесте.

Если вы используете различные экземпляры DbContext Entity Framework является не в состоянии kwnow этого объекта серии существует в базе данных, серия стала deattached объектом для DBContest, например, в тесте (Google для deattached структуры объекта)

Вы должны совместно использовать один и тот же экземпляр DBContext для тестирования и фабрики, или работать с серией как объект с расширением.

+0

Спасибо. Это была проблема. Тестирование и завод выполнялись под разными dbContexts, но указывали на одну и ту же БД. –

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