Vous ne pouvez pas avoir les mêmes noms de table dans différents modèles de structure d'entité?

.net c# entity-framework sql-server

Question

Mon application utilise deux bases de données SQL 2008 différentes. Les bases de données ont quelques tables avec le même nom, à savoir. Users . Je voudrais utiliser EF4 pour ces deux bases de données. Cependant, lorsque j'exécute mon application et que la création de la deuxième base de données dans objectcontext est effectuée, le message d'erreur suivant s'affiche:

Plusieurs types portant le nom 'User' existent dans EdmItemCollection dans différents espaces de noms. Le mappage basé sur une convention nécessite des noms uniques sans tenir compte de l'espace de noms dans l'espace de noms EdmItemCollectionto

Est-ce que cela signifie que je ne peux pas utiliser deux bases de données avec (partiellement) les mêmes noms de table dans la même application? Ils se trouvent dans différents espaces de noms, différents modèles edmx, différents projets, etc.

PS L'un des modèles est généré par le concepteur et utilise les classes POCO. L'autre est déduit de la base de données et est étroitement couplé à EF.

Réponse acceptée

L'erreur signifie ce qu'il dit: vous ne pouvez pas utiliser le mappage basé sur la convention par défaut dans votre scénario. Utilisez plutôt un mappage de base de données personnalisé . Scott Guthrie a un article de blog détaillé à ce sujet.


Réponse populaire

Pour utiliser le "mappage basé sur la convention par défaut", les deux approches suivantes fonctionneront:

1) La collision est provoquée par la chaîne de connexion utilisant un caractère générique:

    metadata=res://*/Repositories.EntityFramework.Model.csdl|res://*/Repositories.EntityFramework.Model.ssdl|res://*/Repositories.EntityFramework.Model.msl;

Comme * ne fonctionne pas dans votre projet, vous pouvez définir plusieurs chaînes de connexion pour coder en dur l’ensemble contenant edmx.

2) créer un assistant

    public static EntityConnection GetEfConnectionString(this string sqlConnectionString)
    {
        var cs = string.Format(@"metadata=res://{0}/Repositories.EntityFramework.Model.csdl|res://{0}/Repositories.EntityFramework.Model.ssdl|res://{0}/Repositories.EntityFramework.Model.msl;provider=System.Data.SqlClient;provider connection string=""" + sqlConnectionString + @"""",
            Assembly.GetCallingAssembly().FullName
        );

        return new EntityConnection(cs);
    }

Mise à jour 2017:

    public static string GetEfConnectionString(this string sqlConnectionString, Type type)
    {
        string cs =
            string.Format(
                @"metadata=res://{0}/Models.Model.csdl|res://{0}/Models.Model.ssdl|res://{0}/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=""" +
                sqlConnectionString + @"""",
                type.Assembly.FullName
                );
        return cs;
    }


    // usage: don't "new" EntityConnection.  See 2012 comment.
    string connString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString.GetEfConnectionString();
    using(var entities = new XyzEntities(connString))


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow