簡體   English   中英

使用代碼優先EntityFramework將ASP WebProject上載到WebHosting-CREATE DATABASE'master'

[英]Upload ASP WebProject to WebHosting with Code-First EntityFramework - CREATE DATABASE 'master'

因此,我使用MVC構建了asp.net Web項目,並且在localhost中使用EntityFramework 6.0的代碼優先方法可以正常工作。

本周,我購買了一個新的虛擬主機來上傳我的網站。

問題是,每當我運行該網站時,它都會嘗試在數據庫“ master”中創建一個數據庫,為什么會這樣?

我正在選擇我的Web Hosting在ConnectionString上提供的正確數據庫。

有一個注意事項:我也在使用ASP Identity OWIN ...也許是問題所在? 它正在使用另一個ConnectionString嗎?

我的身份配置(用於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);

        }
    }
}

這是我的DbContext,稱為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; }
    }
}

這是我的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:我知道我用來創建默認管理員的這種機制並不是最好的方法,以后我將其更改為種子方法,我只需要立即使用此方法,然后即可處理所有重構。


PS2:導致錯誤的日志消息(如上所示,我正在使用customErrors = Off)在以下行中:

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

這行會在數據庫'master'上觸發一個創建數據庫,這不是在ConnectionString上指定的!

如上面在ConnectionString中所見,它應該在名為“ mydbname_en_wmx00”的數據庫上創建所有DbContext和IdentityDbContext表。

我嘗試使用相同的ConnectionString作為參數值在Web.Config上使用EntityFramework默認工廠,並且開始獲取(內部服務器錯誤500),因此我回滾並刪除了這個EntityFramework默認工廠配置...


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

Database.SetInitializer<MyContext>(null);

它不會觸發數據庫上的任何CREATE並且一切正常,問題是我需要在數據庫上手動設置所有內容,例如AspNetRoles和AspNetUsers等,以及我的所有DbContext表(Stuff1,stuff2等)。


PS4:也許您認為此鏈接是一個重復的問題,但事實並非如此,他使用的是本地SQLEXPRESS實例,而我使用的是來自付費主機的遠程mssql ...


非常感謝您的努力,您知道嗎,這是怎么回事? EF Code-First自動生成的數據庫在付費Web托管上不起作用?

從我的付費虛擬主機看來,這是一個問題。

不支持代碼優先方法(包括從Package Manager控制台運行Update Migrations和Seed Methods),因為您總是知道,它始終引用我沒有權限的“主”數據庫。

因此,我想出了一種解決方法,我從上下文和模型中生成了完整的SQL腳本,然后使用其系統中的工具在遠程數據庫服務器上運行了SQL腳本,並根據每個模型規范創建了所有表。

為了生成SQL腳本,我在程序包管理器控制台上運行以下命令 (確保您之前輸入了Enable-Migrations-如果由於ConnectionString上的遠程主機不允許它而無法啟用Enable-Migrations,則只需創建一個新的指向您的本地數據庫的ConnectionString,然后再次運行“ Enable-Migrations -Force ”(它將對我有用 ,它為我做了):

Update-Database -Script -SourceMigration:0

然后,不要忘記告訴EF上下文您正在使用空的DatabaseInitializer,因此它不會嘗試使用代碼優先的方法來刪除/創建新的Database:

Database.SetInitializer<YourContext>(null);

多虧了StackOverFlow,我找到了這個解決方案,今天我們多么幸運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM