C# 首先从现有数据库为EF代码自定义T4模板-ADO.Net实体数据模型
我试图首先从现有数据库中找到并自定义EF代码的ADO.Net实体数据模型的T4模板 我想要定制或更改的是数据类型映射。我使用的是Oracle的ODP.Net提供程序,它支持EF。由于我的要求,我正在尝试将Oracle数据类型编号重新映射到Int64而不是DecimalC# 首先从现有数据库为EF代码自定义T4模板-ADO.Net实体数据模型,c#,entity-framework,ado.net,t4,odp.net,C#,Entity Framework,Ado.net,T4,Odp.net,我试图首先从现有数据库中找到并自定义EF代码的ADO.Net实体数据模型的T4模板 我想要定制或更改的是数据类型映射。我使用的是Oracle的ODP.Net提供程序,它支持EF。由于我的要求,我正在尝试将Oracle数据类型编号重新映射到Int64而不是Decimal 由于我不熟悉为定制编辑T4文件,我发现很难找到执行代码优先映射的模板文件。感谢您为我指明正确方向的任何帮助。2017年2月更新:您应该查看这个惊人的项目,该项目由T4模板组成,首先从现有数据库中执行代码 这些模板非常容易使用,完全
由于我不熟悉为定制编辑T4文件,我发现很难找到执行代码优先映射的模板文件。感谢您为我指明正确方向的任何帮助。2017年2月更新:您应该查看这个惊人的项目,该项目由T4模板组成,首先从现有数据库中执行代码 这些模板非常容易使用,完全可自定义,我可以轻松地将自定义添加到这些模板中!更不用说它们比原来的EF向导更完整了。该项目的作者/贡献者非常友好,反应迅速,我自己也做了一些贡献 _ (事实证明,我是在通过创建自己的T4模板来重塑方盘) 原始答案(仅用于帮助任何人深入了解EF向导源代码的参考): 我不知道为什么,但是Model First(EF Designer from database)的模板很容易定制(但它们基于EDMX),而来自database的code First的代码并不那么容易-即使您设法找到了模板 如果右键单击项目,单击“实体框架”和“自定义反向工程模板”,您将在文件夹
codemplates\ReverseEngineerCodeFirst
中获得Context.tt
、Entity.tt
和Mapping.tt
但是,这些模板需要由一些外部调用方调用,这些调用方应该将一些上下文信息传递给模板-这就是为什么它们没有像模型第一个模板那样准备好进行自定义
这些模板与您将在(文件夹中)中找到的模板相同。在中,您将找到从数据库读取元数据并传递到这些模板的方法reverseenginercodefirst
。该调用方方法可以复制到其自己的T4模板中(因此您不需要构建Power Tools并在Visual Studio中安装),但它与Visual Studio和项目有一些交互,这在普通T4模板中很难实现
我基于上面提到的方法创建了一个,基本上是通过将ReverseeEngineerCodeFirstHandler.cs
需要的所有类/帮助程序放在一起,并删除对VisualStudioDTE的引用。我的模板上有一些说明,但基本上您应该删除EF.Utility.CS.ttinclude的include
,并注释掉变量“var-efHost”和“var-code”
您将在文件夹codemplates\reverseenginercodefirst
中找到的那些模板与“数据库中的代码优先”向导几乎相同,除了一些细微的区别:
- 向导将一对多导航属性创建为
,而模板将这些属性创建为HashSet
List
- 向导使用空值,如
,而另一个使用int?
空值
- 向导将添加一些代码分析抑制属性
[SuppressMessage]
- 向导将数据库集创建为虚拟数据库集,而模板不创建
- 向导使用数据注释(如
、[Table]
、[Key]
等)和[StringLength]
中的其他部分(属性和关系)生成部分映射。T4模板为每个实体生成配置类内的所有映射(DbContext.OnModelCreating
)EntityTypeConfiguration
尽管我认为这并不重要,但这些差异中的大多数都可以很容易地调整。如果您想进行强大的定制(就像我在模板上做的那样,其中包括自动推断不存在的关系、与视图的关系、类继承),我建议您创建自己的DTO(或POCO),以便将实体/属性/导航属性传递到包含的模板。在我的例子中,我使用原始的
EdmMapping
,将其映射到我的DTO中,对这些DTO进行大量修改(基于我的公司标准),并将这些DTO传递到T4 Include(稍加修改)。您找到什么了吗?据我搜索,它是由DLL生成的,而不是由T4生成的。找到C:\Program Files(x86)\Microsoft Visual Studio 14.0\Common7\IDE\ItemTemplatesCache\CSharp\Data\1033\CFCSEF6\CodeFirst\U CS\U V6.0.vstemplate->这使我找到了C:\Program Files(x86)\Microsoft Visual Studio 14.0\Common7\IDE\Microsoft.Data.Entity.Design.dll。。。但是还找不到确切的代码。@drizin还没找到。如果您找到其他解决方案,请告诉我。