Я использую 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()
{
}
// ...
}
Я не могу полностью понять ваш вопрос, не могли бы вы рассказать подробнее? – adricadar
Проблема должна быть в вашем Factory.После создания серии (1 запись) и вызова SaveChanges() вы получите идентификатор для своей серии, и вы можете использовать его в своем объекте Episode. Второй возможный выбор - создать запись Serie без SaveChanges() и присвоить этот объект обоим вашим Eposides. Если вы создаете два разных объекта, которые не ссылаются на DbContext, DbContext создает две новые записи для каждого Eposide. –
Я не уверен, почему у вас есть фабрика для ваших сущностей, я мог бы это понять, если бы у вас был один для вашего dbContext ..., если у вас есть логика, которая создает вашу сущность, тогда вы можете иметь это в классе сущности. –