Question

Je suis mise en route avec Entity Framework 4, et je une création d'une application de démonstration comme un exercice d'apprentissage. L'application est un simple constructeur de la documentation, et il utilise un magasin de SQL CE. Chaque projet de documentation a son propre fichier de données SQL CE, et l'utilisateur ouvre un de ces fichiers pour travailler sur un projet.

Le EDM est très simple. Un projet de documentation est composé d'une liste de sujets, dont chacun a un titre, une description, et zéro ou plusieurs notes. Donc, mes entités font l'objet, qui contient des propriétés Titre et texte, et d'une note, qui a des propriétés Titre et texte. Il y a un à-plusieurs de réserve de la note.

Je suis en train de comprendre comment ouvrir un fichier de données SQL CE. Un fichier de données doit correspondre au schéma de la base de données SQL CE créée par l'Assistant Création de base de données de EF4, et je mettra en œuvre un nouveau cas d'utilisation du fichier ailleurs dans l'application pour mettre en œuvre cette exigence. En ce moment, je suis juste essayer d'obtenir un fichier de données existant ouvert dans l'application.

Je reproduis mon code existant 'Open File' ci-dessous. Je l'ai mis en place en tant que classe de service statique appelé Services de fichiers . Le code ne fonctionne pas encore tout à fait, mais il suffit de montrer ce que je suis en train de faire. Je suis en train de tenir le ObjectContext ouvert pour les mises à jour des objets d'entité, la disposition lorsque le fichier est fermé.

Alors, voici ma question: Suis-je sur la bonne voie? Que dois-je changer pour faire ce travail de code avec EF4? Y at-il un exemple de la façon de le faire correctement?

Merci pour votre aide.

Mon code existant:

public static class FileServices
{
    #region Private Fields

    // Member variables
    private static EntityConnection m_EntityConnection;
    private static ObjectContext m_ObjectContext;

    #endregion

    #region Service Methods

    /// <summary>
    /// Opens an SQL CE database file.
    /// </summary>
    /// <param name="filePath">The path to the SQL CE file to open.</param>
    /// <param name="viewModel">The main window view model.</param>
    public static void OpenSqlCeFile(string filePath, MainWindowViewModel viewModel)
    {  
        // Configure an SQL CE connection string
        var sqlCeConnectionString = string.Format("Data Source={0}", filePath);

        // Configure an EDM connection string
        var builder = new EntityConnectionStringBuilder();
        builder.Metadata = "res://*/EF4Model.csdl|res://*/EF4Model.ssdl|res://*/EF4Model.msl";
        builder.Provider = "System.Data.SqlServerCe";
        builder.ProviderConnectionString = sqlCeConnectionString;
        var entityConnectionString = builder.ToString();

        // Connect to the model
        m_EntityConnection = new EntityConnection(entityConnectionString);
        m_EntityConnection.Open();

        // Create an object context
        m_ObjectContext = new Model1Container();

        // Get all Subject data
        IQueryable<Subject> subjects = from s in Subjects orderby s.Title select s;

        // Set view model data property
        viewModel.Subjects = new ObservableCollection<Subject>(subjects);
    }

    /// <summary>
    /// Closes an SQL CE database file.
    /// </summary>
    public static void CloseSqlCeFile()
    {
        m_EntityConnection.Close();
        m_ObjectContext.Dispose();
    }

    #endregion
}
Était-ce utile?

La solution

Voici la réponse. J'ai simplifié mon code et a couru sur le modèle EDM plus simple, Disney . Le modèle a deux entités, Character et Child, avec 1: * association entre Character et Child. Les enfants sont les enfants de caractère - trucs assez simple. J'ai écrit la démo comme une application de la console pour le garder aussi simple que possible.

code complet Program.cs se présente comme suit:

class Program
{
    static void Main(string[] args)
    {
        /* See http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/8a89a728-6c8d-4734-98cb-11b196ba11fd */

        // Configure an SQL CE connection string 
        var filePath = @"D:\Users\dcveeneman\Documents\Visual Studio 2010\Demos\SqlCeEf4Demo\SqlCeEf4Demo\DisneyChars.sdf";
        var sqlCeConnectionString = string.Format("Data Source={0}", filePath);

        // Create an EDM connection
        var builder = new EntityConnectionStringBuilder();
        builder.Metadata = "res://*/DisneyChars.csdl|res://*/DisneyChars.ssdl|res://*/DisneyChars.msl";
        builder.Provider = "System.Data.SqlServerCe.3.5";
        builder.ProviderConnectionString = sqlCeConnectionString;
        var edmConnectionString = builder.ToString();
        var edmConnection = new EntityConnection(edmConnectionString);

        // Build and query an ObjectContext
        using (var context = new DisneyCharsContainer(edmConnection))
        {
            var chars = context.Characters;
            foreach(var character in chars)
            {
                Console.WriteLine("Character name: {0}", character.Name);
                foreach(var child in character.Children)
                {
                    Console.WriteLine("Child name: {0}", child.Name);
                }
            }
            Console.ReadLine();
        }
    }
}

Lien en haut du code est à un fil de forum que je l'habitude d'écrire le code.

Voici la soluce: Tout d'abord, créer une connexion de base de données. Depuis que je suis en utilisant SQL CE, je n'ai pas un constructeur de chaîne de connexion - la chaîne de connexion est simplement un chemin, donc je ne pas besoin. Puis-je utiliser un EntityConnectionStringBuilder pour construire une chaîne de connexion de l'entité, et puis j'utiliser pour construire un EntityConnection. Enfin, je passe la connexion au constructeur pour mon ObjectContext. Je peux alors utiliser le ObjectContext pour interroger l'EDM.

Autres conseils

Recherche / ouverture d'une base de données CE SQL Server est, pour une raison bizarre, difficile à faire . Assurez-vous que vous pouvez faire toute sorte de connexion à la DB du tout avant d'essayer de le faire fonctionner avec l'EF.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top