EF数据库上下文不保存更新

时间:2017-07-01 05:01:35

标签: entity-framework

我有一些简单的代码用于更新作为byte []保存在我的数据库中的个人资料图片。由于一些奇怪的原因,它完全没有错误地运行我的代码,但数据库没有使用用户选择的新图片进行更新。

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; }
}

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

2017年7月4日

以下是我在互联网上看到的一些额外的事情:

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

以上两种尝试都没有奏效。调用db.SaveChanges()时,ProfileImage属性仍然只是设置回原始值。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用以下代码吗? :

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,则无需附加它!

答案 1 :(得分:0)

问题是您的实体的ProfileImage属性已应用了一个属性:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

其中,from the documentation告诉实体框架:

  

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

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