无法将实体对象保存到数据库中
我正在尝试编辑已添加的实体对象。无法将实体对象保存到数据库中
我用实体Frameworks`的Code First模型(或模型首先,你喜欢什么都),如下:
public class ImageFile
{
public int Id { get; set; }
[DisplayName("Naam")]
public string FileName { get; set; }
public string ImageUrl { get; set; }
}
在视图我隐藏的ImageUrl,并允许用户上传文件,它能正常工作。发生图像更改后(这是一种Edit方法),我想将对象保存回数据库。
下面的方法演示:
public ActionResult Edit([Bind(Include = "Id,FileName,ImageUrl")] ImageFile imageFile, HttpPostedFileBase actualImage)
{
if(actualImage != null && actualImage.ContentLength > 0)
{
ImageFile originalImageFile = db.Images.Find(imageFile.Id);
if(originalImageFile.FileName != imageFile.FileName)
{
DeleteImage(originalImageFile.FileName);
}
string fullUrl = SaveImage(imageFile, actualImage);
// Set the new imageUrl.
imageFile.ImageUrl = fullUrl.Replace("~", "");
// Save changes to database
var entry = db.Entry(imageFile);
entry.Property(i => i.ImageUrl).IsModified = true;
entry.Property(i => i.FileName).IsModified = true;
db.SaveChanges();
return RedirectToAction("Index");
}
// Else that only changes the filename, instead of uploading a new file.
// Uses same saving logic.
}
正如你可以看到我已经从MVCS'脚手架为我创建的原始编辑-的SaveChanges改变。它类似于:
db.Entry(imageFile).State = EntityState.Modified;
db.SaveChanges();
这两种解决方案都不起作用。第一溶液引发InvalidOperationException
:
其他信息:成员“IsModified”不能被称为用于属性“的ImageUrl”,因为类型“镜像文件”的实体不存在于上下文中。要向上下文添加实体,请调用DbSet的Add或Attach方法。
第二种解决方案也将引发InvalidOperationException
:
其他信息:附加类型“BonTemps.Areas.Admin.Models.ImageFile”的实体失败,因为同一类型的另一实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时可能会发生这种情况。这可能是因为一些实体是新的并且还没有收到数据库生成的关键值。在这种情况下,使用'Add'方法或'Added'实体状态来跟踪图形,然后根据情况将非新实体的状态设置为'Unchanged'或'Modified'。
我真的被困在这里,不知道我能做些什么来保存更改。为什么不能保存?输入ActionResult方法后,是否与我手动设置ImageUrl
有什么关系?
是否应该创建一个ViewModel,并手动进行更改?有没有什么解决方案可以避免为此创建ViewModel?
不是试图告诉EF您已经更改了属性,而是使用刚才从DB中提取的db实体。所以,你必须
// Save changes to database
var entry = db.Entry(imageFile);
entry.Property(i => i.ImageUrl).IsModified = true;
entry.Property(i => i.FileName).IsModified = true;
db.SaveChanges();
的地方将变为
// Save changes to database
originalImageFile.ImageUrl = imageFile.ImageURL;
originalImageFile.FileName = imageFile.FileName;
db.SaveChanges();