2016-07-29 109 views
4

SQL內部我有主鍵爲二進制(8)的表。當我使用Update Model from Database該表添加到我的模型,我可以看到,這列了type = BinaryEntityFramework數據庫優先 - 類型映射 - 將二進制(8)從SQL映射到C#中的int

enter image description here

,並在C#中,我得到的是列byte[]

我可以將該列映射到int嗎?

我知道我可以在SQL創建一個視圖與CAST

SELECT 
    Client_Id, 
    CAST(Client_Id AS INT) AS NewClient_Id, 
    * /*other columns*/ 
FROM 
    dbo.Clients 

,但這不是解決辦法,因爲我必須能寫,不只是從該表中讀取。我知道我可以爲插入創建存儲過程,但我想避免這種情況。

我是usinf EntityFramewor 6.1.3。

+0

你是否也會嘗試將一夸脫放入一個品脫罐中? 'binary(8)'包含8個字節。 C#中的「int」包含4個字節。你在這裏看到問題嗎? –

+0

@Damien_The_Unbeliever對不起,如果我寫了不正確的東西,但我試圖讓它工作。我認爲,如果我可以在SQL中執行CAST,那麼EF可能會爲我執行該操作。我可以通過代碼將'byte []'轉換爲int,但我認爲EF具有這種內置,我只是不知道如何打開或配置它。 – Misiu

+0

你可以寫信給一個視圖。但是,您需要爲視圖提供觸發器,以便將值轉換回來。也是二進制8是一個長期的IIRC – Mark

回答

0

我不知道你爲什麼不堅持int或字節

0

以我的經驗映射過程是很容易混淆的兩個數據庫結構和C#代碼,更新現有的地圖時尤其如此。出於這個原因,我建議你使用

long CurrentClientId = BitConverter.ToInt64(Rec.ClientId) 
上讀

Rec.ClientId = BitConverter.GetBytes(CurrentClientId) 

上寫。你可能已經有了一個包裝器來按摩記錄,因爲它們被讀入內部結構中,這只是一個步驟。

請注意,這並不關注您可能認爲在字節數組中存在的字節順序,但至少該過程將正確地往返。

0

您可以在模型中在內部處理的轉換,具體如下:

[NotMapped] 
    public long ClientId 
    { 
     get { return BitConverter.ToInt64(this.ClientIdBytes, 0); } 
     set { this.ClientIdBytes = BitConverter.GetBytes(value); } 
    } 

    [Column("ClientId")] 
    public byte[] ClientIdBytes { get; set; } 

主叫方與客戶端Id工作作爲一項長期的,但是這個屬性不會映射到數據庫。 getter和setter只是將該值轉換爲第二個屬性,該屬性保留在ClientId數據庫列名中。

+0

這將使用數據庫優先方法嗎? – Misiu

+0

這是唯一的方法,但是您不能使用ClientId字段(即context.MyTable.Where(e => e.ClientId == 1))將LINQ寫入實體查詢。你必須閱讀所有的表格,而不是應用條件(即context.MyTable.ToList()。其中​​(e => e.ClientId == 1)) – bubi

+0

謝謝你的建議,但我想避免加載整個表到內存中 – Misiu

2

你有3種不同的解決方案

x存儲過程,但你不想要它們。

x將一個未映射的屬性添加到您的類。這個解決方案最大的問題是你不能使用未映射的屬性進行查詢。您必須將所有數據讀取到客戶端,然後將條件應用於客戶端上的非映射屬性(這樣您的應用程序才具有可伸縮性)。

[NotMapped] 
public long LongClientId 
{ 
    get { return BitConverter.ToInt64(this.ClientId, 0); } 
    set { this.ClientId = BitConverter.GetBytes(value); } 
} 

這個查詢將行不通

context.MyDbSet.Where(m => m.LongClientId == 12).ToList(); 

您需要更改它以這種方式

context.MyDbSet.ToList().Where(m => m.LongClientId == 12); 

此查詢的結果是,你加載所有表的記錄(從轉移dbms添加到您的應用程序中)放到列表中,而不是您需要的那個。

x創建視圖(可能是索引視圖)並使用INSTEAD OF觸發器。

+0

我在GitHub的EF知識庫中創建了問題,因爲我想在EF6和EF內核中找不到目前可能的問題。我可能會選擇第三種解決方案,因爲我不想將整個表加載到內存中('ToList'就是這樣)。存儲過程也會這樣做,所以現在查看看起來像是最好的解決方案。我會把這個開放,也許有更好的解決方案。 – Misiu