使用Code-First EntityFramework将ASP WebProject上传到WebHosting - CREATE DATABASE'master'

时间:2016-09-30 22:41:47

标签: c# asp.net-mvc entity-framework ef-code-first web-hosting

所以我使用MVC构建我的asp.net web项目,并且使用EntityFramework 6.0的代码优先方法在localhost中正常工作。

本周我买了一个新的虚拟主机来上传我的网站。

问题在于,每当我运行网站时,它都会尝试在数据库“master”中创建数据库,为什么会发生这种情况?

我正在选择我的Web Hosting在ConnectionString上提供的正确数据库。

有一个注释:我也在使用ASP Identity OWIN ......也许这就是问题所在?它正在使用另一个ConnectionString?

我的身份配置(用于OWIN):

from django.test import RequestFactory
from django.views.generic import View


class MiVista(View):
    def get(self, request, var):
        self.var = var
        # <la logica de la vista>
        return HttpResponse(self.var)

rf = RequestFactory()
rf.get('indice/')

one = MiVista.as_view()(rf, var='hello')

这是我的DbContext,名为MyContext:

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);

        }
    }
}

这是我的Web.Config:

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; }
    }
}

PS:我知道我用来创建默认管理员的这种机制不是最好的方法,我稍后会将其更改为种子方法,我只需要立即使用,然后我将处理所有的重构。

PS2:导致错误的日志消息(我正在使用customErrors = Off,如上所示)位于以下行:

<?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>

此行触发数据库'master'上的create database,这不是ConnectionString上指定的内容!

它应该在数据库中创建名为“mydbname_en_wmx00”的所有DbContext和IdentityDbContext表,如上面ConnectionString中所示。

我尝试在Web.Config上使用EntityFramework Default Factory使用相同的ConnectionString作为参数值,我开始获取(内部服务器错误500),所以我只是回滚并删除了这个EntityFramework默认工厂配置......

PS3:我知道如果我在MyContext构造函数上使用以下初始化程序

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

它不会在数据库上触发任何CREATE,一切顺利,问题是我需要在数据库上手动设置所有内容,如AspNetRoles和AspNetUsers等,以及我所有的DbContext表(Stuff1,stuff2等) )。

PS4:也许您认为this link是一个重复的问题,但事实并非如此,他正在使用本地SQLEXPRESS实例,并且我正在使用来自付费主机的远程mssql。 。

非常感谢您的努力,您是否知道,这里发生了什么? EF Code-First自动生成数据库不适用于付费网页托管?

1 个答案:

答案 0 :(得分:0)

这似乎是我付费网络托管的问题..

不支持代码优先方法(包括从Package Manager控制台运行更新迁移和种子方法),因为它总是引用&#39; master&#39;我不知道的数据库,你可能知道......

所以我想出了一个解决方法,我从我的Context和Models生成一个完整的SQL脚本然后我只使用他们系统中的工具在我的远程数据库服务器上运行SQL脚本,并且所有表都是根据每个型号规格。

要生成SQL脚本,我在程序包管理器控制台上运行following command(确保您之前键入启用 - 迁移 - 如果您不能启用 - 迁移,因为您的ConnectionString上的远程主机不允许它,只需创建一个指向本地数据库的新ConnectionString,然后再次运行&#34; 启用 - 迁移 - 强制&#34;它将工作,它为我做了):

Update-Database -Script -SourceMigration:0

然后不要忘记告诉您的EF上下文您使用的是null DatabaseInitializer,因此它不会尝试使用代码优先方法删除/创建新数据库:

Database.SetInitializer<YourContext>(null);

感谢StackOverFlow,我找到了这个解决方案,我们现在有多幸运!