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