实体框架6 - 一对多关系并不想更新,但创建有效

时间:2015-07-09 12:32:39

标签: c# asp.net entity-framework asp.net-mvc-5 ef-code-first

我遇到了一个非常奇怪的问题我无法解释。我可以创建一个新实体并将其链接到他的外键,但我无法更新。这是我的代码

我的Post.cs实体:

public class Post(){
public int Id {get;set;}
public string Title {get;set;}
...
public int PostCategoryId {get;set;}
public virtual Category Category {get;set;}
}

我的Category.cs实体:

public class Category(){
public int Id {get;set;}
public string Title {get;set;}
...    
public virtual IList<Post> Posts {get;set;}
}

控制器中的更新方法:

[HttpPost]
public ActionResult EditPost(Post post) {
....
_repository.UpdatePost(post);

存储库中的UpdatePost方法:

public void UpdatePost(Post post){
var category = _db.Category.SingleOrDefault(x => x.Id == post.PostCategoryId);
post.Category = category;
// I clearly see that the post have the category in the object
_db.Entry(post).State = EntityState.Modified; 
_db.SaveChanges();

我的对象的每个属性都会更新,除非类别。

有没有人有解决方案?

非常感谢你,我无法入睡,因为这个问题:)

3 个答案:

答案 0 :(得分:0)

可能是您的Category变量名为Category,它与类本身完全相同。尝试将其重命名为category(小写)或PostCategory,看看是否有帮助。或者它可能是实体状态的问题。 EntityState通常用于直接从视图模型进行更改,而不是在手动更改对象的字段后。

其实我觉得我知道它是什么。您需要从数据库中获取帖子,而不是类别。

Category category = _db.Category.SingleOrDefault(x => x.Id == post.PostCategoryId);
Post p = db.Post.SingleOrDefault() //whatever code you need to find the Post in the database
p.Category = category;
db.SaveChanges();

我仍然会移除EntityState行。

另外,我假设您只是尝试更新SQL表的“PostCategoryId”条目?在这种情况下,您需要做的就是:

Post p = db.Post.SingleOrDefault() //whatever code you need to find the Post in the database
p.PostCategoryId = post.PostCategoryId
db.SaveChanges();

答案 1 :(得分:0)

Matt S., 也许我错了,但是,如果我从数据库中获得帖子,我将不得不更新可能从用户更新的每个字段(实际上,Post实体中有10个属性)。 并且,PostCategoryId是关于该领域的任何问题。告诉我,如果我错了,但我必须避免要求分类,但要在帖子上获取。喜欢:

var post.Category = _db.Category.SingleOrDefault(x => x.Id == post.CategoryId) 

我可以为此创建一个方法,并在每次需要检索与Post相关的类别实体时调用它。

但我想我可以更新类别&#34;进入帖子&#34;并在我需要时调用post.Category。也许这是对我的误解?

答案 2 :(得分:0)

查看您的代码,看起来您的Post对象是一个分离的对象。请看一下这个链接 Save detached entity in Entity Framework 6