我有一些简单的代码用于更新作为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属性仍然只是设置回原始值。
答案 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告诉实体框架:
已计算:插入或更新行时,数据库会生成一个值。
您只需要完全删除该属性。