Entity Framework6 -一对多关系不希望更新,而是创建作品

本文关键字:创建 更新 希望 Framework6 一对多 关系 Entity | 更新日期: 2023-09-27 18:01:45

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

My Post.cs Entity:

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

My Category.cs Entity:

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

控制器中的Update Method:

[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();

对象的每个属性都被更新,除了Category。

有人有解决办法吗?

非常感谢,因为这个问题我睡不着

Entity Framework6 -一对多关系不希望更新,而是创建作品

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

实际上我想我知道它是什么。您需要从数据库中获取Post,而不是Category。
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();

也许我错了,但是,如果我从数据库得到的帖子,我将不得不更新每个字段,可能会从用户更新(事实上,有10个属性在post实体)。并且,PostCategoryId被更新,关于该字段的任何问题。告诉我,如果我错了,但我不得不避免要求类别,但得到它的帖子。如:

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

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

但我想我可以做更新类别"进入帖子",只是调用post。当我需要的时候分类。也许是我误会了?