【问题标题】:How to update virtual property in EF6 Code First?如何在 EF6 Code First 中更新虚拟属性?
【发布时间】:2014-08-21 07:57:00
【问题描述】:

我正在尝试使用 EF6 和 MVC 更新虚拟属性。 我的代码是这样的:

public async Task<ActionResult> Edit([Bind(Include = "Id,Title,Content,Image")] Recommendation recommendation, HttpPostedFileBase file)
        {
            if (ModelState.IsValid)
            {
                if (file != null)
                {
                   //we have an image - saving it to db
                    var image = Server.SaveFile(file, Request);
                    DB.Files.Add(image);
                    await DB.SaveChangesAsync();

                    //assign the new image to the recommendation
                    recommendation.Image = image;
                }

                recommendation.User = await GetLoggedInUserAsync();
                DB.Entry(recommendation).State = EntityState.Modified;
                await DB.SaveChangesAsync();
                return RedirectToAction("Index");
            }
            return View(recommendation);
        }

图像保存在Files 表中。然而Recommendations 表中的Image_Id 列不会更新为新的Image_Id。我在这里错过了什么?

类:

     public class Item
     {
          [Key]
          public int Id { get; set; }
          public virtual ApplicationUser User{ get; set; }

         [Required]
         [DataType(DataType.Text)]
         [Display(Name = "Title")]
         public string Title { get; set; }

         [Required]
         [DataType(DataType.MultilineText)]
         [Display(Name = "Content")]
         public string Content { get; set; }
    }

    public class Recommendation : Item
    {
        [DisplayName("Image")]
        public virtual File Image { get; set; }
    }

    public class File
    {
        [Key]
        public int Id { get; set; }        
        public string Name { get; set; }
        public string Url { get; set; }
    }

【问题讨论】:

  • 更新前recommendation和其他Image有关系吗?同时显示您的课程,ImageRecommendation
  • 并非总是如此。但通常是的。
  • @YuliamChandra:我已经添加了课程

标签: entity-framework asp.net-mvc-5 entity-framework-6


【解决方案1】:

问题是,您正在使用独立关联(没有外键 ID),例如。

public int ImageId { get; set; }

您还可以使用断开连接的对象。所以你需要手动维护关系。在添加新关系之前,您还必须先删除旧关系。

如果您使用的是断开连接的对象,您必须手动管理 同步。 - MSDN

尝试添加此代码以手动管理关系。

var manager = ((IObjectContextAdapter)DB).ObjectContext.ObjectStateManager;
// Removes previous relationship.
if (recommendation.Image != null)
{
    // If there is another image, but you don't remove it, the update will fail.
    manager.ChangeRelationshipState(recommendation, recommendation.Image,
        r => r.Image, EntityState.Deleted);
}

// Adds new relationship.
manager.ChangeRelationshipState(recommendation, image,
    r => r.Image, EntityState.Added);

尝试重新考虑具有外键关联的类设计。

更多信息请参见this post

【讨论】:

  • 我已经添加了外键并且它可以工作。非常感谢!
猜你喜欢
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2014-06-09
  • 2017-07-18
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多