更新属于Entity Framework的所有者

时间:2015-03-19 00:31:22

标签: c# entity-framework

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

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

class Category
   int Id
   string Name

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

我正在公开一个API,所以我们假设我们收到一个特定帖子的HTTP PUT。

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

此时我正在从EF加载Post,并使用AutoMapper将表示XML的View Model映射到其中,然后保存。 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));
}

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

更新

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

0 个答案:

没有答案