我試圖將當前使用自定義DAO框架的項目轉換爲使用實體框架。該系統非常大,因此對數據庫(如果有問題的話,SQL Azure DB)的更改本身並不是特別可行,應儘可能避免。C#:更改實體框架的檢索數據類型
問題出在ID列。不幸的是,當系統創建時,有一些表格有bigint
數據類型,有些表格有int
--但是模型本身都來自基類,ID爲long
。以前的框架能夠處理這種情況,但我一直無法找到一種方法來處理實體框架。
下面是最簡單的例子,我能想到的:
public class Context : DbContext {
public IDbSet<Foo> Foos {get;set;}
public IDbSet<Bar> Bars {get;set;}
}
public abstract class BaseClass {
public long ID;
}
public class Foo : BaseClass {
...
}
public class Bar : BaseClass {
...
}
SQL Table: Foo
+-------------+
| id : bigint |
| ... |
+-------------+
SQL Table : Bar
+-------------+
| id : int |
| ... |
+-------------+
當我嘗試加載Bar
模型,我得到這個錯誤:
The 'ID' property on 'BaseClass' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Int64'.
我想找到一個方式來告訴系統,巴恩已經輸入,而富有很長的路要走。我已經在上下文中重寫了OnModelCreating
,並且爲Bar
定義了HasColumnType
。這給了我一個新的錯誤:
Schema specified is not valid. Errors:
(105,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.Int64[Nullable=False,DefaultValue=]' of member 'ID' in type 'Bar' is not compatible with 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' of member 'ID' in type 'CodeFirstDatabaseSchema.Bar'.
在我看來,如果我只能將請求發送到服務器之前更改的BaseClass
的ID
預期的數據類型爲int
,那麼我應該可以了在收到回覆後轉換爲long
。理想情況下,我希望按照每個班級來做到這一點。
任何人都可以指向正確的方向嗎?
是的 - 這就是我害怕的。我意識到我正試圖用另一個錯誤來解決錯誤。我只是希望能夠用一些小技巧來避免重大改變。我試過的所有東西都不能工作,所以我認爲我已經辭去了自己的職責,完全按照你的建議去做。 如果沒有更好的解決方案進來,我會標記這一個是正確的。 – Merwer 2012-03-08 14:09:21
@Merwer有時,真相會傷害,請不要拍信使=) – casperOne 2012-03-08 14:11:33
Hi @casperOne對不起,我的問題,因爲它是沿着同一主題駁船。有什麼方法可以做相反的事情嗎?我有一個類型爲Int的ID表。它越來越危險地增長,我想知道是否有辦法將它改爲Long? (Entity Framwork CF 6。1) – hjavaher 2014-06-26 01:01:29