我使用MySQL设置了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();
有没有办法在不必复制数组的情况下进行就地更改,以便传播到数据库?例如,将该byte []标记为脏(或更好的解决方案)?
答案 0 :(得分: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;
我怀疑它正在寻找实际设置的属性,以便将其标记为已修改而不是修改属性的内容(就像您怀疑的那样)。