【发布时间】:2017-02-10 14:49:22
【问题描述】:
我正在努力实现一个简单的“更新个人资料”功能(学习目的)。我只是希望每次更新给定配置文件时都不能更新配置文件图像。当图片在那里并且配置文件的其他部分更新时,我希望图片保持不变。
为此我想出了以下代码:
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "UserDetailsId,ImageData,FirstName,LastName,UserAddress,UserCountry,UserPostalCode,UserPhoneNumber,CompanyId,identtyUserId")] UserDetails userDetails, HttpPostedFileBase UploadImage)
{
if (ModelState.IsValid)
{
if (UploadImage!=null) {
byte[] buf = new byte[UploadImage.ContentLength];
UploadImage.InputStream.Read(buf, 0, buf.Length);
userDetails.ImageData = buf;
}
else {
var userFromDb = db.UsersDetails.Where(u => u.identtyUserId == userDetails.identtyUserId).First();//i am getting the old user data
userDetails.ImageData = userFromDb.ImageData; //saving the image to the modified state
}
db.Entry(userDetails).State = EntityState.Modified;//error here
db.SaveChanges();
return RedirectToAction("Index");
}
//ViewBag.CompanyId = new SelectList(db.Companies, "CompanyId", "CompanyName", userDetails.CompanyId);
return View(userDetails);
我在这一行遇到的错误db.Entry(userDetails).State = EntityState.Modified; 如下:
附加类型为“eksp.Models.UserDetails”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后将非新实体的状态设置为“未更改”或“已修改”。
型号:
public class UserDetails
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserDetailsId { get; set; }
public byte[] ImageData { get; set; }
[NotMapped]
public HttpPostedFileBase UploadImage { get; set; }
[NotMapped]
public string ImageBase64 => System.Convert.ToBase64String(ImageData);
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserPhoneNumber { get; set; }
public int CompanyId { get; set; }
public virtual Company Company { get; set; }
public string identtyUserId { get; set; }
public virtual ICollection<WorkRolesUsersDetails> WorkRolesUsersDetails { get; set; }
虽然这对我来说可能看起来很不言自明,但不清楚这是否正在发生?
有人可以指导我如何实现我想要实现的目标吗?
谢谢!
【问题讨论】:
-
我不确定这是否是一个理想的解决方案,但是您是否考虑过先获取记录,然后对其进行修改然后将其发回?服务器可能足够聪明,不会修改未更改的字段。
-
@JamesHughes 可以演示吗?
-
@RobertRoss,恐怕目前还没有,如果您没有得到接受的答案,我今晚会为您提供一些演示代码
-
@JamesHughes 好的,谢谢!
标签: c# asp.net-mvc entity-framework linq