2014-01-27 40 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