【问题标题】:Can't update foreign key in an entity无法更新实体中的外键
【发布时间】:2015-12-27 18:58:30
【问题描述】:

这些是我的模型:

public class Post
{
    [Key]
    public int Id { get; set; }

    public string Title { get; set; }

    [DefaultValue(null)]
    public virtual Image Thumbnail { get; set; }

    public void SetViewModelValues(CreatePostViewModel viewModel)
    {
        Title = viewModel.Title;
    }
}

public class CreatePostViewModel
{
    public string Title { get; set; }

    public int? ThumbnailId { get; set; }
}

以及行动:

    public ActionResult CreatePost(CreatePostViewModel postViewModel, int? id)
    {
        Post post;

        if (id != null)
        {
            post = dbWebContent.Posts.Find(id);
            if (post == null)
                return HttpNotFound();
        }
        else
        {
            post = new Post();
        }

        if (!ModelState.IsValid)
            return View(post);

        post.SetViewModelValues(postViewModel);
        post.Thumbnail = null; // Even setting null doesn't work

        var state = (post.Id == 0) ? EntityState.Added : EntityState.Modified;
        dbWebContent.Entry(post).State = state;

        if (dbWebContent.SaveChanges() > 0)
        {
            ViewBag.Success = true;
            return View(post);
        }

        ViewBag.ErrorMessage = "Error!";
        return View(post);
    }

问题是当我尝试更新Thumbnail 属性时,它不会对数据库进行任何更改。 SaveChanges 方法返回 1(即使 Thumbnail 是唯一修改的属性)。即使我尝试将其设置为空。创建新帖子时一切正常。但是编辑不起作用。 问题是什么?有没有更好的解决方案可以在一个操作中处理添加/更新操作?

这些不是我在Post 类中的所有属性(没有其他外键)。第二个问题是:有没有更好的方法从视图模型创建实体?我的意思是我是否需要将所有这些属性值存储在两个单独的对象中,然后将其从视图模型复制到实体,或者有什么更漂亮的方法可以做到这一点?

【问题讨论】:

  • 你用ThumbnailId做什么?你确定ModelState 有效吗?
  • Thumbnail 翻译成您数据库中的哪种列类型?对于第二个问题,您可以使用 Automapper:github.com/AutoMapper/AutoMapper
  • ModelState 是有效的,我敢肯定。我的数据库中有Images 表是从Image 类创建的。 ThumbnailId 是该表的外键,因此我使用它在该表中查找 Image。但它并不像将Thumbnail 设置为 null 那样简单。
  • 我的意思是它没有积极参与您的(可见)代码。

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

据我所知,这似乎是因为您没有在视图模型中使用ThumbnailId。这是填充Thumbnail的一种方法:

public void SetViewModelValues(CreatePostViewModel viewModel)
{
    Title = viewModel.Title;
    Thumbnail = viewModel.ThumbnailId != null ? db.Images.Find(viewModel.ThumbnailId) : null;
}

另外,创建新帖子时它可以工作是什么意思?缩略图是用非空值创建的?

【讨论】:

  • 添加新帖子(不编辑现有帖子)时,缩略图已正确设置(为空或某些有效图像)。在SetViewModelValuesCreatePost 中设置它有什么区别?我什么都看不到。
【解决方案2】:

我仍然不希望发生这种情况,但我删除了数据库中的所有表并重新创建了它们。现在它正在工作。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多