web-dev-qa-db-fra.com

Puis-je modifier le nom de schéma par défaut dans le cadre d'entité 4.3 en premier?

Actuellement, je déploie mon application dans un environnement d'hébergement partagé et le code en premier avec les 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 à 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 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 utilisateur administrateur, les tables que le code crée en premier en étant connecté en tant qu'administrateur ressemblent à ceci "[admin]. [BlogPosts]". Lorsque l'application s'exécute, toutes les tables sont créées mais j'obtiens une exception EF car elle indique "[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 cela, je dois générer un script de migration à exécuter manuellement et ajouter "[dbo]" devant tous les noms de table car le script ne fait référence aux tables que par leur nom, pas par leur schéma et leur nom.

Existe-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. 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.

48
Chev

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
Eranga

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");
    }
}
130
ferhrosa

Pour les premières implémentations de bases 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

7
Bill

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
petrosmm

Dans EF Code d'abord , par défaut, tout est configuré en fonction de l'accès utilisateur avec un accès gestionnaire " DBO- Schéma "dans SQL Server. Mais si un utilisateur spécifique est défini pour fonctionner avec une base de données courante 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 (Que ce soit ou non L'API Fluent est personnalisable comme suit :)

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

Remarquez ce qui suit: enter image description here

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

4
BehrouzMoslem