2016-04-14 57 views
2

我正在創建一個應用程序,以將數據從一個數據庫傳輸到另一個數據庫,以適應新的應用程序,而且我遇到了一個問題,即訪問舊數據庫中的一些數據。舊數據庫是使用Ruby on Rails創建的,它們是通過Rails設計和創建的,SQL Server中的數據庫沒有主鍵,所有列都可以爲空。新數據庫是在SQL Server中設計和構建的,具有適當的鍵和可空列。由於這兩個數據庫都在SQL Server中,因此我希望使用實體框架數據庫優先進行數據轉換。無法訪問沒有主鍵的實體框架表

在EF Desginer中,我能夠將實體鍵分配給除一個(響應)之外的所有表,這使我無法正確訪問表中的數據。表定義如下:

assess_id [int] NULL 
person_id [int] NULL 
question_id [int] NULL 
question_version [int] NULL 
answer_id [int] NULL 
answer_version [int] NULL 
text [nvarchar(4000)] NULL 
created_at [datetime] NOT NULL 
updated_at [datetime] NOT NULL 

由於允許的記錄的主鍵應包括

assess_id 
person_id 
question_id 
question_version 
answer_id 
answer_version 

但可以存在多個answer_id和answer_version記錄到相同的question_id和question_version或answer_id和answer_version都是空的,所以我不能使用它。該密鑰的任何子集都不允許我正確檢索所有數據。另外,我不能使用created_at或updated_at列,因爲有多個正在使用相同時間戳寫入的行的實例。

我只需要讀取數據而不是寫入數據,因爲它正在轉換到新的數據庫中,並且我無法更改現有的數據庫。有沒有解決關鍵問題的方法?

回答

1

在我回答之前,我想指出,該解決方案僅適用於只讀情況,如果需要寫入表格,它將無濟於事。在這種情況下,我指您this answer你會找到一些幫助。


我設法爲這種情況找到解決方法,雖然容易使用,但我不認爲它是最優的。

爲了解決關鍵問題,我選擇了一個主鍵,至少不會失敗一個空檢查,在這種情況下,只是assess_id和person_id列。這讓我沒有任何錯誤,但我仍然無法正確檢索所有數據。

解決方法是在數據庫上使用SqlQuery。

var responses = context.Database.SqlQuery<Response>("SELECT * FROM dbo.responses"); 

這對整個數據庫執行查詢並將結果集轉化爲具有正確數據的響應列表。確保你在數據庫而不是表上執行查詢,否則將使用設計器中指定的不正確密鑰,並且不會得到正確的數據。

1

把你的SQL放到存儲過程中,並從你的應用程序調用它。

如果無法修改源數據庫,則可以將存儲過程置於目標中。

+0

我沒有能力對現有數據庫進行任何修改,我正在嘗試讀取。 –

+0

@Evan請參閱editted答案。 –