2014-01-27 38 views
1

我有用MySQL設置的LINQ to Entities。LINQ to Entities - 更新二進制字段

一個字段是二進制類型,例如varbinary(50)。

LINQ to Entities以byte []形式正確返回。

但是,如果我只是更改byte []中某個索引的值,則在調用SaveChanges()時不會將更改傳播到數據庫。

例如,這不起作用:

byte[] foo = GetBinaryFromDatabase(context); 
foo[0] = 42; 
context.SaveChanges(); 

我能得到它來保存通過創建一個完全新的字節數組,在複製它,並賦予它回來,而不是就地做一些修改。

例如,這個工程:

byte[] foo = GetBinaryFromDatabase(context); 
byte[] bar = new byte[foo.Length]; 
Array.Copy(foo, bar, foo.Length); 
bar[0] = 42; 
foo = bar; 
context.SaveChanges(); 

有沒有什麼辦法,使就地的變化,而無需使陣列的複製,使得其傳播到數據庫?例如,要將該字節[]標記爲髒(或更好的解決方案)?

回答

0

改性這樣您可以標記一個屬性:

var entry = context.Entry(foo); 

if (entry.State == EntityState.Detached) 
    context.Set<FooType>().Attach(entity); 

entry.Property(e => e.ByteProperty).IsModified = true; 

// Or this if your version of EF doesn't support the lambda version: 
// entry.Property("ByteProperty").IsModified = true; 

我懷疑它正在尋找實際上正在做是爲了紀念它設置屬性的修改,而不是修改屬性的內容(如你疑似)。

+0

謝謝。這工作,一些小的變化。 entry.Property行需要移到if語句之外,否則它不會在已經連接的實體上運行。 其參數中的lambda也無效,但它只是將該字段的名稱作爲字符串來使用。 如果您將此行移到if語句下面,我會將其標記爲答案。 –

+0

在Detached檢查之外移動了「Property」行,但是lambda版本是該方法的首選重載,因爲如果屬性名稱更改,您將收到編譯時錯誤。也許你在你的文件中缺少'using',或者你的EF版本不支持它?以下是引用它的文檔:http://msdn.microsoft.com/en-us/library/gg671304(v=vs.113).aspx – Ocelot20