web-dev-qa-db-fra.com

Comment créer d'abord un modèle visuel de code EntityFramework

Si vous regardez ici vous remarquerez que ce type montre les diagrammes de modèle d'entité, je voudrais savoir comment je peux créer un diagramme de modèle d'entité à partir de mes premières classes de code EntityFramework.

Cela devient frustrant d'essayer de se rappeler comment tout est lié simplement en regardant le code.

54
Callum Linington

Avec Entity Frameworks Power Tools installé, vous pouvez cliquer avec le bouton droit sur le contexte dans la vue de votre solution, cliquer sur "Entity Framework", puis sélectionner "Afficher le modèle de données d'entité".

Cela créera un diagramme soigné de vos classes.

56
Dennis Traub

Un diagramme de modèle de données d'entité n'est qu'un affichage visuel d'un fichier EDMX. Pour obtenir un tel diagramme à partir d'un modèle Code-First, vous devez créer un fichier EDMX à partir de celui-ci:

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

Ce code crée un fichier Model.edmx que vous pouvez ouvrir dans Visual Studio. Il affichera le diagramme du modèle. Le fichier EDMX est un instantané de votre modèle Code-First actuel. Lorsque vous modifiez le modèle dans le code, vous devez créer un nouveau fichier EDMX pour refléter ces modifications dans le diagramme.

49
Slauma

En plus de Slauma sa réponse. Si vous voulez pouvoir ajuster la disposition du diagramme et que vous ne voulez pas recommencer à chaque fois après la création, vous pouvez copier le nœud Diagram du fichier EDMX précédemment dans le nouveau fichier 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"));

// Le modèle mis à jour est prêt à être ouvert avec Visual Studio

4
Jaap

Pour conserver la mise en page d'un diagramme généré par EF Power Tools précédent, cela conservera les positions et couleurs des entités, etc. qui existent dans la nouvelle, et laissera les ajouts tels quels. Sinon, vous ne voyez pas les nouvelles entités dans le diagramme.

    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);
    }
0
Ian