Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先从现有数据库为EF代码自定义T4模板-ADO.Net实体数据模型_C#_Entity Framework_Ado.net_T4_Odp.net - Fatal编程技术网

C# 首先从现有数据库为EF代码自定义T4模板-ADO.Net实体数据模型

C# 首先从现有数据库为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模板组成,首先从现有数据库中执行代码 这些模板非常容易使用,完全

我试图首先从现有数据库中找到并自定义EF代码的ADO.Net实体数据模型的T4模板

我想要定制或更改的是数据类型映射。我使用的是Oracle的ODP.Net提供程序,它支持EF。由于我的要求,我正在尝试将Oracle数据类型编号重新映射到Int64而不是Decimal


由于我不熟悉为定制编辑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]
    等)和
    DbContext.OnModelCreating
    中的其他部分(属性和关系)生成部分映射。T4模板为每个实体生成配置类内的所有映射(
    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还没找到。如果您找到其他解决方案,请告诉我。