使用实体框架更新属于
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