C# 使用EntityFramework 6进行单元测试的导航属性修复
切换到实体框架6后,导航属性的自动修复已被删除。这对我们的单元测试造成了极大的破坏,单元测试的工作假设是设置关系的一侧,也会自动更新另一侧 运行代码时,一切正常,因为DbContext上的DetectChanges方法会自动同步关系,但在进行单元测试时,我更希望不必创建DbContext来进行同步 我发现这个博客解释说,可以将T4模板与EntityFramework6一起重用,但这不适用于空间数据类型,因为空间数据类型已移动到不同的名称空间C# 使用EntityFramework 6进行单元测试的导航属性修复,c#,unit-testing,entity-framework-6,C#,Unit Testing,Entity Framework 6,切换到实体框架6后,导航属性的自动修复已被删除。这对我们的单元测试造成了极大的破坏,单元测试的工作假设是设置关系的一侧,也会自动更新另一侧 运行代码时,一切正常,因为DbContext上的DetectChanges方法会自动同步关系,但在进行单元测试时,我更希望不必创建DbContext来进行同步 我发现这个博客解释说,可以将T4模板与EntityFramework6一起重用,但这不适用于空间数据类型,因为空间数据类型已移动到不同的名称空间 因此,我的解决方案是修改EntityFramework
因此,我的解决方案是修改EntityFramework 4 T4模板文件,并将其修复为与EntityFramework 6一起使用。我将此作为答案发布,但仍然想知道是否有其他人对此有更好的解决方案。通常,EntityFramework4中的T4模板文件也可以直接用于EntityFramework6,以生成具有关系修复的POCO对象。但是,在使用空间数据类型时,需要进行几项修改: 用EF6实用程序替换包含的实用程序文件。这将导入正确的空间名称空间(也可能导入其他名称空间): 为此:
var textTransform = DynamicTextTransformation.Create(this);
EdmItemCollection ItemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile) as EdmItemCollection;
并在最后一个#>标记之前的最底部添加缺少的ArgumentNotNull方法:
公共静态void ArgumentNotNull(T arg,字符串名称),其中T:class
{
如果(arg==null)
{
抛出新的ArgumentNullException(名称);
}
}
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;
public static void ArgumentNotNull<T>(T arg, string name) where T : class
{
if (arg == null)
{
throw new ArgumentNullException(name);
}
}