2016-07-27 31 views
2

我知道我可以使用Sql方法在遷移期間更新數據,並且它對於可以在純SQL中表達的簡單事情非常有用。在實體框架遷移期間讀取數據庫(選擇查詢)

我也知道我可以使用Seed方法,但這會感覺像一個黑客(我想寫的代碼必須執行一次,當執行遷移)。

在我目前的情況下,我需要從列中去掉HTML標籤,然後將其寫入遷移中添加的新列。我已經有了一個C#方法,完全可以做到這一點。我想要做的是遍歷C#中的每一行,併爲每一行生成一個SQL語句,用相應的HTML剝離文本更新該行。

更一般地說,我認爲在遷移期間能夠在C#中讀取數據庫可能在很多情況下都很方便。在遷移事務中這樣做是完美的,但爲此,我需要檢索Entity Framework內部用於遷移的SQL連接。

到目前爲止,我找不到執行返回結果的SQL查詢的方法。這可能嗎?

回答

1

我還希望通過Seed方法轉換遷移文件中的數據。

更新數據不應該是一個問題,你可以做如下圖所示的代碼行,你也可以從C#傳遞參數的SQL字符串:

Sql("UPDATE TableName SET MyValueInMinutes= -DATEDIFF(MINUTE, CurrentTime, 0)"; 

的問題,通過數據閱讀!實際上,您將永遠不需要處理C#中的數據轉換,通常您可以在SQL Server中創建所有內容(存儲過程和函數以及SQL stametents),並且您可以在需要時或在需要時在遷移文件中調用它們數據已準備好被轉換。但是我認爲你不是數據庫程序員,那就是你試圖在C#中處理數據的原因。

這裏是一個如何遍歷行的例子,我將搜索給定的文本併爲您找到一個免費的'AnyText'+ Counter。

CREATE PROCEDURE sp_FindFreeName 
@toBeFindName nvarchar(MAX) OUT 
AS 
BEGIN 
DECLARE @LoopCounter INTEGER 
SET @LoopCounter = 1 
WHILE EXISTS (SELECT @toBeFindName FROM dbo.MyTable WHERE Name = @toBeFindName) 
    BEGIN 
     SET @toBeFindName = 'AnyText', @LoopCounter) 
     SET @LoopCounter = @LoopCounter + 1 
    END 
END 

然後你就可以稱爲形式C#:

var cSharpName = string.Empty; 
Sql("exec sp_FindFreeName @[email protected]"+ cSharpName +" OUTPUT"); 

從C#哪裏cSharpName給出。

第三個爲什麼要這樣做,你也可以編寫自己的代碼優先遷移操作。你必須確定你的SqlServerMigrationSqlGenerator在羅文博客描述:

https://romiller.com/2013/02/27/ef6-writing-your-own-code-first-migration-operations/

結論:

如果你真的想在遷移文件讀取數據,那麼你必須使用例如:SqlDataReader,你也必須從App.config中讀取連接字符串。

在大多數情況下,您可以在SQL Server中執行所有操作。只需創建您的數據傳輸SQL腳本並從所需的位置執行它們即可。

您可以使用Extensions和SqlServerMigrationSqlGenerator以更清晰的方式執行DataReader。

+0

感謝您的回答。正如你猜測的那樣,我對SQL不太習慣(也不是我的同事),而且,我想我可以用SQL編寫整個網站,但我們選擇C#作爲一個更方便除簡單的數據庫查詢之外的任何語言(例如解析HTML,包括格式錯誤的HTML)。我會看看遷移操作',但乍一看,他們不提供數據庫連接(你可以盲目地導出SQL字符串?)。如果可能的話,我想避免爲數據庫創建一個獨特的連接/事務。 – youen

+0

@youen然後使用種子方法進行遷移。種子方法在每次遷移級別遷移期間將被稱爲X時間。使用If esle ...找到你當前工作的級別,然後你可以在C#中使用非常簡單的方式來添加,刪除或更新數據。如果這能解決你的問題,請不要忘記投票並回答問題^^ –

+0

@youen有一件事情仍然很重要,有兩種類型的種子方法,一種用於初始化,另一種用於遷移。使用遷移種子,閱讀此PLZ https://blog.oneunicorn.com/2013/05/28/database-initializer-and-migrations-seed-methods/ –