生成的代码概述(实体数据模型设计器)
ADO.NET 实体框架提供了相应的工具,以便根据 .edmx 文件的概念架构定义语言 (CSDL) 内容自动生成对象层。 默认情况下,ADO.NET 实体数据模型设计器(实体设计器)用来生成对象层代码的自定义工具为 EntityModelCodeGenerator。 有关自定义工具的信息,请参见实现单文件生成器(可能为英文网页)。 还可以使用 EdmGen.exe 命令行工具。 有关更多信息,请参见How to: Use EdmGen.exe to Generate Object Model Files。 EntityModelCodeGenerator 和 EdmGen.exe 命令行工具使用 EntityClassGenerator 类生成源代码。
实体设计器还可使用文本模板来生成自定义的对象层代码。 有关更多信息,请参见如何:自定义对象层代码生成(实体数据模型设计器)。
生成对象层代码
可以通过多种方式触发用于生成对象层代码的默认自定义工具:
使用 ADO.NET 实体数据模型向导。 有关更多信息,请参见实体数据模型向导。
使用模型更新向导。 有关更多信息,请参见模型更新向导(实体数据模型工具)。
运行在 Custom Tool .edmx 文件属性中指定的工具。 为此,请在**“解决方案资源管理器”中右击 .edmx 文件并选择“运行自定义工具”**。 有关 .edmx 文件属性的更多信息,请参见 .edmx 文件概述(实体框架)。
保存 .edmx 文件。
按 Tab 键离开已更改的 .edmx 文件。 请注意,这包括按 Tab 键离开在实体设计器中打开的已更改 .edmx 文件。
构建具有已更改 .edmx 文件的项目。
注意: 上面的选项可生成或覆盖具有以下名称的 Visual Basic 或 C# 源代码文件:<模型名称>.Designer.vb 或 <模型名称>.Designer.cs。此文件将添加到“解决方案资源管理器”中的 .edmx 节点。 使用 EdmGen.exe 命令行工具。 使用 EdmGen.exe 工具生成具有在命令行中指定的名称和位置的 Visual Basic 或 C# 源代码文件。
注意: |
---|
如果对象层代码是通过默认自定义工具或 EdmGen.exe 工具生成的,将会覆盖现有对象层代码。有关如何避免覆盖对象层的自定义项的信息,请参见How to: Customize Generated Data Objects。 |
注意: |
---|
基于概念模型中的函数导入生成的方法将结合 ExecuteFunction 方法执行相应的存储过程。如果您正在使用不接受合并选项参数的重载,则将使用 AppendOnly 选项。 |
注意: |
---|
从 Visual Studio 2010 开始,代码生成器将 ObjectContext 的 LazyLoadingEnabled 属性设置为在概念模型中定义的 annotation:LazyLoadingEnabled 批注特性的值。默认情况下,annotation:LazyLoadingEnabled 值设置为 true。
|
确定生成的代码的命名空间
默认情况下,生成的代码的命名空间是在项目的“应用程序”页(可能为英文网页)中指定的命名空间。 如果您在 .edmx 文件的 Custom Tool Namespace 属性中指定命名空间,则使用所指定的命名空间。
根据项目类型的不同,还需要考虑其他一些注意事项,如下所示:
对于 Visual Basic 项目,如果尚未设置 Custom Tool Namespace 属性的值且项目具有空命名空间,则生成的代码的命名空间将是 .edmx 文件中指定的概念模型命名空间。 有关更多信息,请参见确定默认命名空间(可能为英文网页)。 如果指定自定义工具命名空间,则 Visual Studio 编译器将在您指定的名称前添加项目的根命名空间。 即使类型是在指定的命名空间中定义的,当您声明这些类型时,也必须导入
defaultnamespace.specifiednamespace
。 例如,如果项目的根命名空间为ProjectDefaultNamespace
,而您在 Custom Tool Namespace 属性中指定了TestNamespace
,那么,当您声明在TestNamespace
中定义的类型时,必须使用:Import ProjectDefaultNamespace.TestNamespace
。对于 C# 项目,如果尚未为 Custom Tool Namespace 属性指定命名空间,则生成的代码的命名空间将是项目的默认命名空间加上 .edmx 文件位置的文件夹路径,项目的默认命名空间在项目的“应用程序”页(可能为英文网页)中指定。 例如,如果 .edmx 文件相对于项目根目录的路径为 Folder1/Folder2/Model.edmx,则生成的代码的命名空间将为 ProjectDefaultNamespace.Folder1.Folder2。
对于 ASP.NET 网站项目,如果 .edmx 文件位于 App_Code 文件夹的根目录中,则生成的代码的命名空间将为概念模型的命名空间,如 .edmx 文件的 CSDL 内容中所定义(有关更多信息,请参见Schema Element (CSDL))。 如果 .edmx 文件位于 App_Code 文件夹的子文件夹中,则生成的代码的命名空间将为相对于 App_Code 文件夹的文件夹路径。 例如,如果 .edmx 文件位于 App_Code/Folder1/Folder2 中,则生成的代码的命名空间将为 Folder1.Folder2。
使用项目中的多个 .edmx 文件
如果项目包含多个基于具有公用表名的数据库的 .edmx 文件,则生成的代码可以包含冲突的类名。 发生这些冲突的情况以及如何解决这些冲突取决于项目类型,如下所示:
对于 C# 项目,如果多个基于具有公用表名的数据库的 .edmx 文件位于同一项目文件夹中,则冲突的类名可能会显示在生成的代码中。 若要解决冲突,请为每个 .edmx 文件的 Custom Tool Namespace 属性指定唯一值,或者将每个 .edmx 文件置于单独的项目子文件夹中。
对于 Visual Basic 项目,如果多个基于具有公用表名的数据库的 .edmx 文件位于项目中的任意位置,则冲突的类名可能会显示在生成的代码中。 若要解决冲突,请为每个 .edmx 文件的 Custom Tool Namespace 属性指定唯一值。
对于 ASP.NET 网站项目,如果多个基于具有公用表名的数据库的 .edmx 文件位于 App_Code 文件夹或 App_Code 目录的同一子文件夹中,则冲突的类名可能会显示在生成的代码中。 若要解决冲突,请将每个 .edmx 文件置于 App_Code 目录的单独子文件夹中。
请注意,每种情况的解决方法都会更改为每个 .edmx 文件生成的代码的命名空间;可能需要更新使用生成的类的现有应用程序代码。
扩展分部类
在通过实体数据模型工具生成数据类时,将以分部类的形式实现这些数据类。 您可以通过扩展已生成的分部数据类向对象中添加功能。 拥有分部类后,您能够用单独源文件中的自定义方法和属性扩展这些类,而无需担心在已生成的文件刷新时丢失您的自定义。 有关更多信息,请参见How to: Customize Generated Data Objects。