7

我試圖將當前使用自定義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'. 

在我看來,如果我只能將請求發送到服務器之前更改的BaseClassID預期的數據類型爲int,那麼我應該可以了在收到回覆後轉換爲long。理想情況下,我希望按照每個班級來做到這一點。

任何人都可以指向正確的方向嗎?

回答

4

儘管您可以隱式轉換bigint to an int in SQL Server,但看起來Entity框架EDM類型(這實際上是您正在處理的)不允許從64位整數類型到32位的隱式轉換整數類型。

這可能是很好的理由,因爲您可能很容易溢出並且其值不符合int字段。

也就是說,你應該有兩個基類,一個用於int ID和一個用於long ID。這不太好,但是它強制你確實想要的邏輯;你將無法存儲大於數據庫中的int的值,那麼爲什麼你希望能夠在代碼級別上完成呢?實體框架在這裏做正確的事情不會讓你應用這種轉換。

+0

是的 - 這就是我害怕的。我意識到我正試圖用另一個錯誤來解決錯誤。我只是希望能夠用一些小技巧來避免重大改變。我試過的所有東西都不能工作,所以我認爲我已經辭去了自己的職責,完全按照你的建議去做。 如果沒有更好的解決方案進來,我會標記這一個是正確的。 – Merwer 2012-03-08 14:09:21

+0

@Merwer有時,真相會傷害,請不要拍信使=) – casperOne 2012-03-08 14:11:33

+0

Hi @casperOne對不起,我的問題,因爲它是沿着同一主題駁船。有什麼方法可以做相反的事情嗎?我有一個類型爲Int的ID表。它越來越危險地增長,我想知道是否有辦法將它改爲Long? (Entity Framwork CF 6。1) – hjavaher 2014-06-26 01:01:29