实体框架6创建单个相关记录

时间:2015-06-04 06:22:40

标签: c# entity-framework-6

我在涉及电视剧的项目中使用Entity Framework。 通过加载Episode文件加载数据。当我创建一个剧集时,它应该找到它所属的系列并使用它,或者创建一个新剧集。

我正在使用" EpisodeFactory"创建剧集,直到我保存,然后为每集创建一个新系列。

我正在寻找:

  • 系列:Id = 01,姓名=' Gotham'
  • 剧集:Id = 21,姓名=' GothamS01E01',系列= 01
  • 剧集:Id = 22,姓名=' GothamS01E02',系列= 01

我得到的是什么:

  • 系列:Id = 01,姓名=' Gotham'
  • 系列:Id = 02,姓名=' Gotham'
  • 系列:Id = 03,姓名=' Gotham'
  • 剧集:Id = 21,姓名=' GothamS01E01',系列= 02
  • 剧集:Id = 22,姓名=' 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()
    {
    }

    // ...
}

1 个答案:

答案 0 :(得分:0)

您是否在test和Factory中共享相同的DBContext实例?如果不是这就是您在工厂方法和测试中使用不同DBContext实例的问题。

如果使用不同的DBContext实例,Entity Framework无法知道数据库中是否存在该系列对象,则系列会成为测试中DBContest实例的deattached对象(google for deattached entity framework)

您必须跨测试和工厂共享相同的DBContext实例,或者使用系列作为deatthaced对象。