我在涉及电视剧的项目中使用Entity Framework。 通过加载Episode文件加载数据。当我创建一个剧集时,它应该找到它所属的系列并使用它,或者创建一个新剧集。
我正在使用" EpisodeFactory"创建剧集,直到我保存,然后为每集创建一个新系列。
我正在寻找:
我得到的是什么:
以下是我的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 :(得分:0)
您是否在test和Factory中共享相同的DBContext实例?如果不是这就是您在工厂方法和测试中使用不同DBContext实例的问题。
如果使用不同的DBContext实例,Entity Framework无法知道数据库中是否存在该系列对象,则系列会成为测试中DBContest实例的deattached对象(google for deattached entity framework)
您必须跨测试和工厂共享相同的DBContext实例,或者使用系列作为deatthaced对象。