2011-06-05 139 views
12

我們遇到了將Web應用程序部署到另一個環境的小問題。 我們使用實體框架代碼優先方法(使用模型創建的數據庫自動創建)來創建應用程序的數據庫。 在此開發環境中,我們正在使用集成安全性,並且這些表是在dbo用戶下創建的。該表是像
          [DBO]。[myTable的]實體框架代碼優先和數據庫用戶

對於我們其他的環境中,我們使用用戶名/密碼認證的數據庫。 我們編寫了表格並在DB上創建了它們。所以他們現在命名爲喜歡
          [myDbUser]。[myTable的]

運行應用程序時,我們總是會遇到的問題
          無效的對象名稱DBO。 myTable的」。

似乎代碼仍在嘗試尋找一個dbo表,它不存在,因此失敗。

誰能解釋一下這個問題嗎?實體框架從哪裏獲取這個dbo前綴?

感謝

回答

17

顯式地指定模式:

[Table("Users", Schema = "dbo")] 
public class User { .. } 

或指定默認的數據庫架構爲用戶 - 「DBO」

+0

指定架構和你將如何在流利做到這一點? (沒有屬性) – Ronald 2011-06-05 19:40:30

+0

Littlefool,重寫OnModel創建你的數據庫上下文類並在那裏指定映射。這裏是一個例子:http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx – 2011-06-05 19:47:25

+0

我試過了。唯一的事情是,當我調試我看到代碼永遠不會在OnModelCreating方法。我的印象是它從一些緩存源獲取模型。 – Ronald 2011-06-05 20:02:30

0

我就遇到了這個問題,最近還有我們支持幾種不同的模式與相同的模型。我基本想到的是將模式名稱傳遞給映射模型的類/方法。例如,EntityTypeConfiguration子類將模式名稱作爲構造函數參數,並將其與硬編碼字符串一起傳遞到ToTable()

在這裏看到更詳細的解釋:https://stackoverflow.com/a/14782001/243607

1

要流利

protected override void OnModelCreating(DbModelBuilder modelBuilder) 

modelBuilder.Entity<ClassName>().ToTable("TableName", "SchemaName"); 
+0

這將工作與SQL視圖? – JQuery 2015-07-20 14:40:46