2014-11-21 144 views
0

我正在尝试编辑已添加的实体对象。无法将实体对象保存到数据库中

我用实体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?

回答

0

不是试图告诉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(); 
相关问题