如何首先创build一个EntityFramework代码的视觉模型

如果你看这里,你会注意到这个人正在显示实体模型图,我想知道如何从我的EntityFramework代码第一类创build一个实体模型图。

试图通过查看代码来记住每件事物如何链接在一起,这只会令人沮丧。

安装Entity Frameworks Power Tools后,您可以右键单击解决scheme视图中的上下文,单击“entity framework”,然后select“查看实体数据模型”。

这将从你的课堂上创build一个整洁的图表。

实体数据模型图只是一个EDMX文件的可视化显示。 为了从Code-First模型中获得这样的图表,您必须从中创build一个EDMX文件:

using System.Data.Entity.Infrastructure; // namespace for the EdmxWriter class using (var ctx = new MyContext()) { using (var writer = new XmlTextWriter(@"c:\Model.edmx", Encoding.Default)) { EdmxWriter.WriteEdmx(ctx, writer); } } 

此代码将创build一个可在Visual Studio中打开的文件Model.edmx 。 它将显示模型图。 EDMX文件是当前Code-First模型的快照。 在代码中更改模型时,必须创build一个新的EDMX文件以反映图表中的更改。

除了Slauma他的回答。 如果您希望能够调整图表的布局,并且您不希望在创build后每次都重做此图表,则可以将图表节点从以前的EDMX文件复制到新的EDMX文件中:

  string sPath = @"c:\Development\{0}"; try { File.Copy(String.Format(sPath, "Model.edmx"), String.Format(sPath, "ModelTemplate.edmx")); File.Delete(String.Format(sPath, "Model.edmx")); } catch (Exception) { //no worry, file not found issues } using (var ctx = new ShopID.Models.ShopIDDb()) { using (var writer = new XmlTextWriter(String.Format(sPath, "Model.edmx"), Encoding.Default)) { EdmxWriter.WriteEdmx(ctx, writer); } } XmlDocument oldModel = new XmlDocument(); oldModel.Load(String.Format(sPath, "ModelTemplate.edmx")); XmlDocument newModel = new XmlDocument(); newModel.Load(String.Format(sPath, "Model.edmx")); var nsmgr = new XmlNamespaceManager(newModel.NameTable); nsmgr.AddNamespace("diagram", "http://schemas.microsoft.com/ado/2009/11/edmx"); XmlNode node = oldModel.SelectSingleNode("//diagram:Diagrams", nsmgr).ChildNodes[0]; XmlNode newNode = newModel.SelectSingleNode("//diagram:Diagrams", nsmgr); XmlNode importNode = newNode.OwnerDocument.ImportNode(node, true); newModel.ImportNode(importNode, true); newNode.AppendChild(importNode); newModel.Save(String.Format(sPath, "Model.edmx")); File.Delete(String.Format(sPath, "ModelTemplate.edmx")); 

/ /更新的模型已准备好用Visual Studio打开

要保留之前EF Power Tools生成的图表的布局,这将inheritance新实体中存在的实体位置和颜色等,并保留原样。 否则,你不会看到图中的新实体。

  static void CopyLayout(string srcFile, string destFile) { var oldModel = XDocument.Load(srcFile); var newModel = XDocument.Load(destFile); XNamespace edmxNs = "http://schemas.microsoft.com/ado/2009/11/edmx"; // find all entity shapes var oldEts = oldModel.Root.Descendants(edmxNs + "EntityTypeShape").Select(ets => ets).ToList(); var newEts = newModel.Root.Descendants(edmxNs + "EntityTypeShape").Select(ets => ets).ToList(); // replace any matching new with old foreach (var newEt in newEts) { var match = oldEts.SingleOrDefault(ot => ot.Attribute(@"EntityType").Value == newEt.Attribute(@"EntityType").Value); if (match != null) newEt.ReplaceAttributes(match.Attributes()); } newModel.Save(destFile); }