問題描述:在使用EF+CodeFirst的時候,使用linq生成的數據庫語句錯誤。dbo 變爲了 CodeFirstDatabasehtml
問題詳細:寫完代碼後,生成的sql語句sql
SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name], [Extent1].[Age] AS [Age], [Extent1].[Sex] AS [Sex], [Extent1].[Birthday] AS [Birthday] FROM [CodeFirstDatabase].[W_User] AS [Extent1]
出現問題:Invalid object name 'CodeFirstDatabase.W_User(無效的對象名稱'CodeFirstDatabase.W_User'。)數據庫
問題思考 :爲何生成的sql語句 是 [CodeFirstDatabase].[W_User] 而不是 [dbo].[W_User],CodeFirstDatabase 是怎麼產生的?架構
解決過程:上網搜索,找到相關知識點:"[dbo].[W_User]"中的dbo 是 數據庫的默認用戶,在查看代碼的過程當中發現上下文中重寫了OnModelCreating()方法:ide
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.HasDefaultSchema(""); }
將HasDefaultSchema("") 改爲HasDefaultSchema("dbo")後,成功訪問數據庫。ui
待處理:瞭解OnModelCreating方法。其次,代碼是根據某案例寫的,不知道爲何本身敲出來就不行,還須要深刻探究。spa
補充1:HasDefaultSchema("") 是指定數據庫默認架構,若是沒有這句代碼 modelBuilder.HasDefaultSchema("");默認的就是dbo 這樣就不會有錯,文檔:https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/gg696284(v=vs.113)。code
補充2:數據庫架構解釋 參見博文:https://www.cnblogs.com/chillsrc/p/3383098.htmlhtm