我遇到了一个非常奇怪的问题我无法解释。我可以创建一个新实体并将其链接到他的外键,但我无法更新。这是我的代码
我的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();
我的对象的每个属性都会更新,除非类别。
有没有人有解决方案?
非常感谢你,我无法入睡,因为这个问题:)
答案 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