实体框架-使生成的程序和功能签名不依赖于EF



这是实体框架6.1.3。

我希望能够为我的存储过程提取interface。我希望这个接口不依赖于EntityFramwork.dll程序集,这样我就可以以抽象的方式将其公开给客户端层,这样他们就不会对Entity Framework有感知/引用/依赖。

问题是EF在生成的方法签名中放入了像ObjectResultObjectParameter这样的类。这些类是在程序集EntityFramework.dll中定义的,因此它在提取的接口上注入依赖性,这是我想要避免的。

我用这种方式解决了ObjectResult问题:我编辑了MyEntities.Context.tt文件,在方法public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)中,我发现了一行原来是这样的:

returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",

所以我把它改成了这个:

returnType == null ? "int" : "System.Collections.Generic.IEnumerable<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",

因此,生成过程的返回类型不再是ObjectResult<>,而是IEnumerable<>,这很好。

但我没能解决ObjectParameter病例的问题。当我们有Output参数(或InOut参数)时,这些由EF生成。例如,我想在ref int myParam的方法签名中替换默认生成的ObjectParameter myParam。并将ObjectParameter处理保留在方法代码中,而不是其签名中。因此,每个方法都应该在内部创建ObjectParameter,并将返回的值放入out/ref方法参数中。

我很努力,但找不到这样编辑MyEntities.Context.tt的方法。也许对T4和EF有更好了解的人可以提出一个简单的解决方案。。。

非常感谢!

解决方案是以最适合客户的方式定义接口,并提供一个适应EF所需代码的实现。

换句话说,不要试图通过编辑T4模板或滥用EF来在方孔中挤一个圆钉。相反,创建一个独立的实现来封装EF或将调用委托给EF,并以适合接口的方式转换返回的数据。这个实现可能只包含几行代码,因为它只需要处理转换,或者,因为你正在处理一个存储过程,所以从等式中完全删除EF,并直接通过ADO.NET调用SP。通过EF建模这个SP可能没有多大意义。

最新更新