如果你看here,你会注意到这个人正在展示实体模型图,我想知道如何从我的EntityFramework代码中创建一个实体模型图。
只是通过查看代码来记住所有内容如何链接在一起,这是令人沮丧的。
答案 0 :(得分:55)
安装Entity Frameworks Power Tools后,您可以右键单击解决方案视图中的上下文,单击“实体框架”,然后选择“查看实体数据模型”。
这将从您的课程中创建一个整洁的图表。
答案 1 :(得分:46)
实体数据模型图只是EDMX文件的可视化显示。为了从Code-First模型获得这样的图表,您必须从它创建一个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);
}
}
此代码创建一个可以在Visual Studio中打开的文件Model.edmx
。它将显示模型图。 EDMX文件是当前Code-First模型的快照。在代码中更改模型时,必须创建一个新的EDMX文件以反映图中的这些更改。
答案 2 :(得分:4)
除了Slauma他的回答。如果您希望能够调整图表的布局,并且您不希望在创建后每次都重做这个,您可以将Diagram节点从以前的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
打开更新的模型答案 3 :(得分:0)
要保留先前EF Power Tools生成的图表的布局,这将继承新图片中存在的实体位置和颜色等,并保留任何添加内容。否则,您在图中看不到新实体。
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);
}