如何使用edmgen.exe生成.edmx.diagram文件?
我完全懂你的困扰:用edmgen.exe成功生成了EDMX核心文件和实体类,但就是拿不到Visual Studio里通过「添加ADO.NET数据模型」自动创建的.edmx.diagram文件——这个文件负责在VS里展示数据库结构的可视化UML视图,卡在这里确实让人头疼。
核心结论:edmgen.exe不支持生成.diagram文件
先给你吃个定心丸:edmgen.exe是官方提供的命令行工具,但它的职责仅限于生成EDMX的核心结构(CSDL/SSDL/MSL)和实体类代码,完全没有生成.diagram文件的能力。这个.diagram文件是Visual Studio内部设计器专属的辅助文件,属于VS的私有功能,微软并没有开放对应的命令行参数让edmgen.exe直接生成它。
可行的解决方案
方案1:手动在Visual Studio中补全(最省心)
这是最简单的处理方式:
- 把你已经生成好的
DataModel.edmx文件添加到Visual Studio项目里 - 双击打开EDMX文件,VS的实体数据模型设计器会自动检测是否存在对应的
.edmx.diagram文件 - 如果不存在,设计器会自动生成一个基础的.diagram文件,并且根据EDMX的内容自动布局实体关系图,完全不用手动调整
方案2:在你的代码流程中加入模板生成逻辑
因为.edmx.diagram本质是结构固定的XML文件,你可以提前准备一个模板,在生成EDMX之后自动复制并替换必要参数:
- 先从Visual Studio自动生成的项目里复制一个基础的
.edmx.diagram文件,作为模板(比如命名为DataModel.edmx.diagram.template),放到你的Resources目录下 - 在你的
GenerateORMFiles方法中,添加复制模板并生成最终文件的逻辑:// 复制并生成diagram文件 string diagramTemplatePath = Path.Combine(ResourcesDirectory, "DataModel.edmx.diagram.template"); string diagramTargetPath = workingDirectory + @"\DataModel.edmx.diagram"; File.Copy(diagramTemplatePath, diagramTargetPath, true); // 可选:替换模板中的占位符(比如实体容器名称) string diagramContent = File.ReadAllText(diagramTargetPath); diagramContent = diagramContent.Replace("###EntityContainerName", "DBContext"); File.WriteAllText(diagramTargetPath, diagramContent);
基础的.diagram文件结构大概是这样的(你可以根据实际实体调整):
<?xml version="1.0" encoding="utf-8"?> <edmx:Diagrams xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx"> <edmx:Diagram Id="Diagram1"> <edmx:EntityTypeShape EntityType="Models.Student" Width="1.5" Height="1.40625" X="0.75" Y="1.5" IsExpanded="true" /> <edmx:EntityTypeShape EntityType="Models.Course" Width="1.5" Height="1.40625" X="3" Y="1.5" IsExpanded="true" /> <!-- 更多实体形状和关系连接线 --> </edmx:Diagram> </edmx:Diagrams>
如果你的EDMX里实体数量很多,手动维护模板不太现实,这种情况下方案1会更高效。
方案3:尝试EF Power Tools(可选)
如果你需要完全自动化生成,可以试试EF Power Tools,它提供了额外的右键菜单和命令行功能,其中包含生成实体关系图的选项。不过这个工具已经停止更新,只支持较旧的EF版本,需要根据你的项目版本判断是否适用。
针对你现有代码的调整建议
在你现有代码的GenerateORMFiles方法中,完成EDMX内容替换的代码之后,插入复制diagram模板的逻辑即可。比如在这段代码之后:
File.WriteAllText(EdmxLocation, text);
添加处理diagram文件的代码,就能自动生成对应的.edmx.diagram文件了。
内容的提问来源于stack exchange,提问作者Ganesh Kamath - 'Code Frenzy'

