如何首先创建EntityFramework代码的可视化模型

时间:2013-09-06 12:38:24

标签: c# visual-studio entity-framework asp.net-mvc-4 visual-studio-2012

如果你看here,你会注意到这个人正在展示实体模型图,我想知道如何从我的EntityFramework代码中创建一个实体模型图。

只是通过查看代码来记住所有内容如何链接在一起,这是令人沮丧的。

4 个答案:

答案 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);
    }