0

Donc, je construis mon projet web asp.net en utilisant MVC et ça fonctionne très bien dans localhost en utilisant l'approche code-en-tête d'EntityFramework 6.0.Télécharger ASP WebProject sur WebHosting avec Code-First EntityFramework - CREATE DATABASE 'master'

Cette semaine, j'ai acheté un nouvel hébergement Web pour télécharger mon site Web.

Le problème est que, chaque fois que je lance le site Web, il essaie de créer une base de données dans la base de données «maître», pourquoi cela se passe-t-il?

Je sélectionne la bonne base de données que mon Web Hosting a fourni sur ma ConnectionString.

Il y a une note: J'utilise aussi ASP Identity OWIN ... c'est peut-être le problème? il utilise un autre ConnectionString?

Mon identité Config (Utilisé pour OWIN):

namespace MyNamespace 
{ 
    public class IdentityConfig 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.CreatePerOwinContext(() => new MyContext()); 
      app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
       LoginPath = new PathString("/Home/Login"), 
      }); 
      FormsAuthentication.SetAuthCookie("CookieValue", false); 

     } 
    } 
} 

Et voici mon DbContext appelé MyContext:

namespace MyNamespace.DAL 
{ 
    public class MyContext : IdentityDbContext<IdentityUser> 
    { 
     public MyContext() : base("MyNamespace.DAL.MyContext") 
     { 
      if (!Roles.Any(r => r.Name == "admin")) 
      { 
       var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(this)); 
       RoleManager.Create(new IdentityRole("admin")); 
      }     


      if (!Users.Any(u => u.UserName == "myuser")) 
      { 
       var store = new UserStore<IdentityUser>(this); 
       var manager = new UserManager<IdentityUser>(store); 

       var user = new IdentityUser { UserName = "myuser" }; 

       manager.Create(user, "mypw123"); 
       manager.AddToRole(user.Id, "admin"); 
      } 
     } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     } 

     public DbSet<Item1> stuff1 { get; set; } 
     public DbSet<Item2> stuff2 { get; set; } 
     public DbSet<Item3> stuff3 { get; set; } 
     public DbSet<Item4> stuff4 { get; set; } 
     public DbSet<Item5> stuff5 { get; set; } 
    } 
} 

Voici mon web.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections></configSections> 

    <appSettings> 
    <add key="owin:AppStartup" value="MyNamespace.IdentityConfig" /> 
    </appSettings> 

    <connectionStrings> 
    <add name="MyNamespace.DAL.MyContext" providerName="System.Data.SqlClient" connectionString="server=myhostingmssql07; uid=myuserid_en_wmx00; database=mydbname_en_wmx00; password=mybdpw;" /> 
    </connectionStrings> 

    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
    <customErrors mode="Off"/> 
    <trust level="Full" /> 
    </system.web> 

    <!--More stuff here..--> 

</configuration> 

PS: Je sais que ce mécanisme j'ai utilisé pour créer des admins par défaut ne sont pas la meilleure approche, je vais changer à une méthode de semences plus tard, j'ai juste besoin de mettre ce travail en ce moment, alors je vais gérer tout le refactoring.


PS2: Le message du journal provoque l'erreur (j'utilise customErrors = Off comme vous pouvez le voir ci-dessus) est sur la ligne suivante:

if (!Roles.Any(r => r.Name == "admin")) 

Cette ligne déclenche une créer base de données base de données 'master', ce n'est pas ce qui est spécifié sur ConnectionString !!

Il faut créer toutes les tables DbContext et IdentityDbContext sur la base de données appelée « mydbname_en_wmx00 » comme vous pouvez le voir ci-dessus dans ConnectionString ..

J'ai essayé d'utiliser Factory Default EntityFramework sur web.config en utilisant comme valeur de paramètre de la même ConnectionString et j'ai commencé à (Internal Server Error 500), donc je viens de rouler en arrière et a supprimé cette EntityFramework configuration d'usine par défaut ...


PS3: Je sais que si j'utilise la suivante Initializ er sur MyContext constructeur:

Database.SetInitializer<MyContext>(null); 

ne déclenche pas de base de données et créer sur tout va bien, le problème est que je dois tout mettre en place manuellement sur la base de données, comme AspNetRoles et AspNetUsers, etc etc, et toutes mes tables DbContext (Stuff1, stuff2, etc).


PS4: Peut-être que vous pensent this link est une double question, mais ce n'est pas, il utilise par exemple SQLEXPRESS local, et je me sers d'un MSSQL éloigné de mon hôte payé ...


Merci beaucoup pour votre effort, savez-vous par hasard, que se passe-t-il ici? Les bases de données auto-générées EF Code-First ne fonctionnent pas sur les Web-Hostings payants?

Répondre

0

Il semble que c'est un problème de mon versé d'hébergement web ..

Il n'y a pas soutenir des approches de code-première (qui comprend l'exécution des migrations à jour et méthodes de semences de Package Manager Console), car il a toujours référence la base de données 'master' dont je n'ai pas les permissions, comme vous le savez peut-être ..

Donc, j'ai trouvé une solution de contournement, je génère un script SQL complet à partir de mon contexte et des modèles, puis je lance juste le script SQL sur mon serveur de base de données distant à l'aide d'un outil de leur système, et toutes les tables sont créées en fonction de chaque spécification de modèle.

Pour générer le script SQL je lance le following command sur la console Package Manager (assurez-vous que vous avez saisi enable- avant Migrations - si vous ne pouvez pas activer immigrations parce que votre hôte distant sur le ConnectionString ne permet pas , il suffit de créer un nouveau ConnectionString pointant vers votre base de données locale, puis exécutez à nouveau « Activer immigrations -Force » ça marche, il l'a fait pour moi):

Update-Database -Script -SourceMigration:0 

Merci de ne pas oublier de dire à votre EF Contextes que vous utilisez un DatabaseInitializer nul pour qu'il n'essaie pas de supprimer/créer une nouvelle base de données en utilisant l'approche code-first:

Database.SetInitializer<YourContext>(null); 

Merci à Stackoverflow j'ai trouvé cette solution, comment nous sommes aujourd'hui la chance!