Puis-je modifier le nom du schéma par défaut dans entity framework 4.3 code-first?

Actuellement, je déploie mon application dans un environnement d'hébergement partagé et le code-first avec migrations fonctionne très bien, sauf pour un hoquet mineur. Chaque fois que je veux pousser le site, je dois utiliser l'option" Update-Database-script " car je dois ajouter au début de chaque nom de table [dbo] car par défaut, l'hôte partagé crée un nom de schéma par défaut qui est le même nom que le nom d'utilisateur de la base de données.

Si je me connecte à mon hôte partagé et crée une base de données, je dois alors créer un utilisateur. Si je nomme cet administrateur utilisateur, alors le code des tables crée d'abord lorsqu'il est connecté en tant qu'administrateur ressemble à ceci "[admin].[BlogPosts]". Lorsque l'application s'exécute, toutes les tables sont créées mais j'obtiens une exception EF car elle dit "[dbo].[BlogPosts] " n'est pas valide. Si je renomme le nom du schéma de la table en "[dbo] " au lieu de "[admin]", cela le corrige.

Pour contourner ce problème, je dois générer un script de migration à exécuter manuellement et ajouter "[dbo] " devant toute la table noms car le script ne fait référence aux tables que par leur nom, pas par leur schéma et leur nom.

Y a-t-il un moyen facile de contourner cela? Ce serait tellement bien si tout ce que j'avais à faire était de publier l'application et tout fonctionnait parfaitement. Si ce n'était pas pour la différence de nom de schéma, ce serait un déploiement en un clic et tout serait glorieux.

45
demandé sur Chev 2012-03-05 11:12:07

5 réponses

Vous pouvez utiliser la méthode ToTable pour spécifier le nom du schéma. Si vous ne spécifiez pas le nom du schéma, EF utilisera par convention dbo.

public class MyContext
{
    private string schemaName = "Foo";

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
    } 
}
32
répondu Eranga 2015-04-15 13:40:12

Pour ceux qui utilisent Entity Framework 6, utilisez simplement la méthode HasDefaultSchema:

public class Contexto : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
    }
}
124
répondu ferhrosa 2014-02-27 18:24:12

Pour les premières implémentations de base de données, c'est facile. Ouvrez le fichier edmx, faites un clic droit - > Propriétés et définissez le schéma de base de données par défaut.

Pour le code d'abord, cet article semble le plus prometteur. http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design

6
répondu Bill 2013-11-08 02:38:45

Je voudrais ajouter puisque c'est pour C#, j'en ai écrit Un ci-dessous pour VB

Public Class ClientDbContext
Inherits DbContext
Public Property Clients As DbSet(Of Client)

Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
    modelBuilder.HasDefaultSchema("dbo")
End Sub
End Class
4
répondu petrosmm 2014-12-30 21:51:24

Dans EF Code first , par défaut, tout est configuré en fonction de l'accès utilisateur avec un accès Managérial " dbo-Schema " dans SQL Server. Mais si un utilisateur spécifique est défini pour fonctionner avec une base de données commune dans l'hébergement partagé, il n'y aura plus d'accès à la gestion Dbo. Cette fois, les noms de nos tables sont dbo.tableName, par exemple, someUser.tableName, et l'inexactitude de ce point rend impossible l'exécution du programme. Pour modifier et affecter explicitement un utilisateur connecté à une base de données. Si vous utilisez des métadonnées, la méthode suivante doit être utilisée:

[Table("MyTableName", Schema="MySchemaName")]
public class MyClassName
{
 //Other Lines...
}

Ou (Si oui ou non API Fluent est personnalisable comme suit:)

modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");

Notez ce qui suit: entrez la description de l'image ici

Une bonne référence pour l'étude: http://www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/

3
répondu BehrouzMoslem 2017-10-03 14:39:39