在運行時更改實體框架數據庫模式

asp.net c# entity-framework

在大多數asp.net應用程序中,您可以通過在運行時修改連接字符串來更改數據庫存儲。即我只需更改connectionstring中“database”字段的值,即可從使用測試數據庫更改為生產數據庫

我正在嘗試使用實體框架更改架構(但不一定是數據庫本身),但沒有運氣。

我看到的問題是edmx xml文件中的SSDL內容正在存儲每個實體集的模式

見下文

<EntitySet 
    Name="task" 
    EntityType="hardModel.Store.task" 
    store:Type="Tables" 
    Schema="test"  />

現在我已將schema屬性值從test更改為“prod”,它可以工作..

但這似乎不是一個好的解決方案。

  1. 我需要更新外部實體集以及存儲過程(我有+50個表)
  2. 我只能在編譯時這樣做嗎?
  3. 如果我然後嘗試稍後更新實體模型 - 由於EF沒有識別該表已經存在於edm中而正在讀取已存在的實體。

有什麼想法嗎?

一般承認的答案

更新在閱讀您的註釋後,很明顯您希望更改每個數據庫的引用模式, 而不是數據庫。我已經編輯了這個問題以澄清這一點並恢復您提供的樣本EDMX,它隱藏在原始格式中。

我將在下面重複我的評論:

如果架構在同一個DB中, 則無法在運行時切換它們(除了僅使用EF 4代碼)。這是因為兩個不同模式中的兩個具有相同名稱和結構的表被認為是完全不同的表。

我也同意上面的JMarsch:我重新考慮在同一個數據庫中放置測試和生產數據(或者實際上是“ 任何東西和生產數據”)的設計。似乎是對災難的邀請。

下面的老答案。

您確定要更改正確的連接字符串嗎? EF使用的連接字符串嵌入連接字符串中,該字符串指定CSDL / SSDL / etc的位置。擁有一個“普通”連接字符串是常見的,供應用程序的其他部分使用(例如,ASP.NET成員資格)。在這種情況下,更改DB時必須更新兩個連接字符串。

同樣,如果在運行時更新連接字符串,則必須使用特定工具 ,這些工具可以理解EF連接字符串格式,並且與通常的連接字符串構建器分開。請參閱鏈接中的示例。另請參閱有關分配EF連接字符串的此幫助


熱門答案

我有同樣的問題,這真的很煩人,因為這是微軟真的錯過了船的情況之一。使用EF的一半原因是支持其他數據庫,但除非您首先使用代碼並不能真正解決問題。

在MS SQL中,更改模式毫無意義,因為模式是表的標識的一部分。對於其他類型的數據庫,模式非常不是數據庫標識的一部分,只能確定數據庫的位置。連接到Oracle並更改數據庫和更改架構本質上是同義詞。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因