![](/img/trans.png)
[英]CREATE DATABASE permission denied in database 'master'. EF Code-first asp.net Core 3.1
[英]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.