生成的代码概述(实体数据模型设计器)

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 文件的项目。

    Cc982041.note(zh-cn,VS.100).gif注意:
    上面的选项可生成或覆盖具有以下名称的 Visual Basic 或 C# 源代码文件:<模型名称>.Designer.vb 或 <模型名称>.Designer.cs。此文件将添加到“解决方案资源管理器”中的 .edmx 节点。

  • 使用 EdmGen.exe 命令行工具。 使用 EdmGen.exe 工具生成具有在命令行中指定的名称和位置的 Visual Basic 或 C# 源代码文件。

Cc982041.note(zh-cn,VS.100).gif注意:
如果对象层代码是通过默认自定义工具或 EdmGen.exe 工具生成的,将会覆盖现有对象层代码。有关如何避免覆盖对象层的自定义项的信息,请参见How to: Customize Generated Data Objects

Cc982041.note(zh-cn,VS.100).gif注意:
基于概念模型中的函数导入生成的方法将结合 ExecuteFunction 方法执行相应的存储过程。如果您正在使用不接受合并选项参数的重载,则将使用 AppendOnly 选项。

Cc982041.note(zh-cn,VS.100).gif注意:
从 Visual Studio 2010 开始,代码生成器将 ObjectContextLazyLoadingEnabled 属性设置为在概念模型中定义的 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

本节内容

另请参见

概念

.edmx 文件概述(实体框架)