C# 无法将实体对象保存到数据库

C# 无法将实体对象保存到数据库,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在尝试编辑已添加的实体对象 我用于实体框架“代码优先”或“模型优先”的模型(无论您喜欢什么)如下所示: public class ImageFile { public int Id { get; set; } [DisplayName("Naam")] public string FileName { get; set; } public string ImageUrl { get; set; } } 在视图中,我隐藏了ImageUrl,并允许用户上传一个

我正在尝试编辑已添加的实体对象

我用于实体框架“代码优先”或“模型优先”的模型(无论您喜欢什么)如下所示:

public class ImageFile
{
    public int Id { get; set; }
    [DisplayName("Naam")]
    public string FileName { get; set; }

    public string ImageUrl { get; set; }
}
在视图中,我隐藏了ImageUrl,并允许用户上传一个正确工作的文件。图像发生更改后,这是一种编辑方法,我想将对象保存回数据库

以下方法演示了:

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脚手架为我创建的原始编辑保存更改。有点像:

db.Entry(imageFile).State = EntityState.Modified;
db.SaveChanges();
两种解决方案都不起作用。第一个解决方案引发InvalidOperationException:

其他信息:无法为属性“ImageUrl”调用成员“IsModified”,因为上下文中不存在“ImageFile”类型的实体。要向上下文添加实体,请调用DbSet的add或Attach方法

第二个解决方案还引发InvalidOperationException:

其他信息:附加“BonTemps.Areas.Admin.Models.ImageFile”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“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();