使用实体框架更新属于

EF(来自Rails Active Record)非常新,我有这样的实体(伪代码):

class Post
   int Id
   int CategoryId // Foreign Key
   Category Category
   string Title

class Category
   int Id
   string Name

在这种情况下,类别是固定的,不能通过邮政进行编辑,只能分配。

我正在公开一个API,所以让我们说,例如,我们收到一个特定的Post的HTTP PUT。

<Post>
  <Id>1</Id>
  <Category>
    <Id>5</Id>
    <Name>General</Name>
  </Category>
  <Title>Edited Title</Title>
</Post>

此时,我正在从EF中加载帖子,并使用AutoMapper将表示XML的视图模型映射到其中,然后保存。 ViewModel不公开CategoryId外键。

在保存帖子时,我遇到了一系列问题,包括正在创建的新类别,正在编辑的现有类别以及以下错误:

“属性'Id'是对象关键信息的一部分,不能修改。”

我想我可能在这里错过了一些基本原则,但我不确定是什么。 任何指导赞赏。

更新:

好的,我已经通过各种层抽取了所有内容,以便直接在控制器操作中简化它,如下所示:

public HttpResponseMessage Put(int id, [FromBody]PostViewModel viewModel)
{
   Post post = Context.Posts.SingleOrDefault(p => p.Id == id);

   // Merge the view model with the entity to update it
   Mapper.Map<PostViewModel, Post>(viewModel, post);

   Context.SaveChanges();

   return Request.CreateResponse(HttpStatusCode.OK, Mapper.Map<Post, PostViewModel>(post));
}

在保存行上放置一个断点,我可以在实体上看到正确的嵌套类别和类别标识,但是它在保存时创建了一个新类别。

更新:

设置类别的EntityState为Detached似乎做我想做的事情,邮政上的类别被更改(因为它的设置FK),它不会编辑现有类别或通过“嵌套”模型添加新类别。 这是处理这个问题的正确方法吗?

链接地址: http://www.djcxy.com/p/33487.html

上一篇: Updating a belongs to with Entity Framework

下一篇: How do you rename a Git tag?