2013-03-27 30 views
2

在這裏學習用LINQ學習經驗豐富的SQL和ADO。用LINQ聲明SQL Server varbinary字段的正確方法

在繼續我的項目並使任何類型更改太昂貴之前,請讓我知道使用varbinary列的正確方法。他們應該如何用LINQ聲明?它應該映射到什麼類型,以免造成任何疼痛。

現在我已經測試了映射到byte []數組,並且它在一些初始測試中工作得很好。我打算存儲從流中收集的數據,並且由於流的內容可以通過ToArray()方法以字節數組格式獲得,所以這種方法似乎是可行的。

private byte[] _testVarbinary; 
[Column(Storage="_testVarbinary")] 
public byte[] testVarbinary 
{ 
    get 
    { 
     return this._testVarbinary; 
    } 
    set 
    { 
     this._testVarbinary = value; 
    } 
} 

... 

// Reading 
Console.WriteLine("Field size: {0}", f.testVarbinary.Length); 

// Updating 
f.testVarbinary = new byte[]{128, 129, 130, 131}; 
db.SubmitChanges(); 

那麼,我應該映射到其他更多的LINQ-esque類型嗎?或堅持與基本byte[]就好了。

回答

1

byte[]應該可以正常工作,但如果您願意,也可以使用Linq.Binary類。它表示一個不可變的字節塊(byte[]是可變的)。

使用f.testVarbinary[0] = 123;將無法​​修改記錄的值,因爲該實體僅跟蹤屬性testVarbinary,而不是數組的每個元素。你可能只標記屬性通過調用屬性setter剛修改,如:

f.testVarbinary = f.testVarbinary; 

但是,這樣做的標準方法是:

DbEntityEntry<MyEntity> entry = context.Entry(f); 
entry.Property(e => e.testVarbinary).IsModified = true; 

或者標記整個實體修改,使用:

entry.State = EntityState.Modified; 
+0

好吧,如果我不打算更新單獨的字節值,那麼'Linq.Binary'會是一個更嚴格的類型使用?實際上,我嘗試用'byte []'來更新單個元素,即'f.testVarbinary [0] = 123; db.SubmitChanges();'但它不會導致數據庫值發生任何變化。我想它並沒有觸發一些內部的「改變」標誌,也許有一些手動觸發它的方法。 – Passiday 2013-03-28 07:15:40

+0

@Passiday我已更新我的答案,以包含手動標記實體或其屬性爲已修改的相關詳細信息。 – 2013-03-28 14:35:16

+0

非常好,謝謝! – Passiday 2013-03-28 14:50:21