【问题标题】:EF Database context not saving updateEF数据库上下文不保存更新
【发布时间】:2017-12-05 01:34:38
【问题描述】:

我有一些简单的代码用于更新以字节[] 形式保存在我的数据库中的个人资料图片。出于某种奇怪的原因,它在我的代码中运行时完全没有错误,但是数据库没有使用用户选择的新图片进行更新。

Client client = db.Clients.FirstOrDefault(c => c.Email == User.Identity.Name);
if (client != null)
{
    client.ProfileImage = bytes;
    db.Clients.Attach(client);
    var entry = db.Entry(client);
    entry.Property(e => e.ProfileImage).IsModified = true;
    db.SaveChanges();
}

下面是Client实体类的代码:

public partial class Client
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Client()
    {
        Customers = new HashSet<Customer>();
    }

    public int ID { get; set; }

    public int? StripeID { get; set; }

    [Required]
    [StringLength(200)]
    public string Name { get; set; }

    [Required]
    [StringLength(150)]
    public string Email { get; set; }

    public Guid UserID { get; set; }

    public bool IsActive { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public byte[] ProfileImage { get; set; }

    public virtual StripeInfo StripeInfo { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Customer> Customers { get; set; }
}

此外,在调试代码之后,我可以看到配置文件图像被设置为正确的字节 [] 并且 client.ProfileImage 然后包含正确的字节 [],但是一旦调用 db.SaveChanges(),客户端.ProfileImage 立即设置回原来的样子。没有发生错误或任何事情,所以我真的无法弄清楚为什么会发生这种情况。

2017 年 7 月 4 日

以下是我在互联网上查看了更多之后尝试的一些其他方法:

1) 创建一个新的数据库上下文实例来进行更新。 2) 处理掉原来的数据库上下文并创建一个新的上下文来进行更新。

上述尝试均未奏效。调用 db.SaveChanges() 时,ProfileImage 属性仍然只是设置回原始值。

【问题讨论】:

  • 请向我们展示实体Client 的代码,以及上下文中是否包含任何自定义代码。
  • @DavidG 刚刚添加了Client实体类的代码。我的数据库上下文没有任何自定义代码。
  • @DavidG 哇,我刚刚注意到配置文件图像上方的 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 行....这当然是问题所在。我不知道它在那里。
  • 你是对的!添加一个答案,我将更改接受的答案并给你赏金。对此感到抱歉。
  • @DavidG 如果您发布答案,我会接受它,以便您获得赏金。如果你不帮忙,我就不会注意到这个问题。

标签: entity-framework


【解决方案1】:

问题在于您的实体的 ProfileImage 属性应用了一个属性:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

from the documentation 告诉实体框架:

计算:数据库在插入或更新行时生成一个值。

您只需要完全删除该属性即可。

【讨论】:

    【解决方案2】:

    你可以试试下面的代码吗? :

    Client client = db.Clients.FirstOrDefault(c => c.Email == User.Identity.Name);
    if (client != null)
    {
        client.ProfileImage = bytes;    
        var entry = db.Entry(client);
        entry.Property(e => e.ProfileImage).IsModified = true;
        db.SaveChanges();
    }
    

    如果client 已经从上下文中加载,则无需附加它!

    【讨论】:

    • 我只是试了一下,它仍然没有更新数据库。
    • 还有其他想法吗?我在网上找不到任何东西。它不起作用对我来说没有意义。
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多