【问题标题】:LINQ to Entities - updating binary fieldLINQ to Entities - 更新二进制字段
【发布时间】:2014-01-27 14:37:38
【问题描述】:

我用 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[] 标记为脏(或更好的解决方案)?

【问题讨论】:

    标签: c# mysql linq entity-framework binary


    【解决方案1】:

    您可以像这样将属性标记为已修改:

    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;
    

    我怀疑它正在寻找实际设置的属性,以便将其标记为已修改,而不是修改属性的内容(就像您怀疑的那样)。

    【讨论】:

    • 谢谢。这很有效,只是做了一些小的改动。 entry.Property 行需要移到 if 语句之外,否则它不会在已经附加的实体上运行。其参数中的 lambda 也不起作用,但无论如何它只是将字段的名称作为字符串。如果您将此行移至 if 语句下方,我会将其标记为答案。
    • Property 行移到 Detached 检查之外,但 lambda 版本是该方法的首选重载,因为如果属性名称更改,您将收到编译时错误。也许您的文件中缺少 using,或者您的 EF 版本不支持它?这是引用它的文档:msdn.microsoft.com/en-us/library/gg671304(v=vs.113).aspx
    猜你喜欢
    • 2013-02-16
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多