非常新的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)并且它不编辑现有类别或通过“嵌套”模型添加新类别。这是处理这个问题的正确方法吗?