使用EntityFramework 6进行单元测试的导航属性修正

时间:2014-11-13 15:02:39

标签: c# unit-testing entity-framework-6

切换到Entity Framework 6后,已删除导航属性的自动修复。这对我们的单元测试造成了严重破坏,单元测试在假设设置关系的一侧时也会自动更新另一侧。

运行代码时一切正常,因为DbContext上的DetectChanges方法会自动同步关系,但是在进行单元测试时,我不想创建DbContext只是为了进行同步。

我发现此博客解释说可以将T4模板与EntityFramework6一起使用,但这对于已迁移到不同命名空间的Spatial数据类型不起作用。

所以我的解决方案是修改EntityFramework 4 T4模板文件,并修复它以使用EntityFramework 6.我已经发布了这个作为答案,但仍然想知道是否有其他人有更好的解决方案。< / p>

1 个答案:

答案 0 :(得分:0)

通常,EntityFramework4中的T4模板文件也可以直接用于EntityFramework6,以生成具有Relationship fixup的POCO对象。但是,在使用空间数据类型时,需要进行一些修改:

将实用程序文件包含在EF6实用程序中。这将导入正确的空间名称空间(也可能导入其他空间):

<#@ include file="EF6.Utility.CS.ttinclude"#>

现在让EF4模板文件与EF6实用程序一起使用:

替换看起来像这样的EF4元数据加载器(分开:

MetadataLoader loader = new MetadataLoader(this);
...
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);

有了这个:

var textTransform = DynamicTextTransformation.Create(this);
EdmItemCollection ItemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile) as EdmItemCollection;

并在最底部添加缺少的ArgumentNotNull方法,就在最后#&gt;之前标记:

public static void ArgumentNotNull<T>(T arg, string name) where T : class
{
    if (arg == null)
    {
        throw new ArgumentNullException(name);
    }
}