【问题标题】:Entity Framework6 - One to many relationship doesn't want to update, but create worksEntity Framework6 - 一对多关系不想更新,但创造作品
【发布时间】:2015-07-09 12:32:38
【问题描述】:

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

我的 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();

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

有人有解决办法吗?

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

【问题讨论】:

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


    【解决方案1】:

    您的 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();
    

    【讨论】:

    • 您好,Matt S,我没有解释我尝试过的所有解决方案,但是,是的,我尝试将属性名称更改为 PostCategory,但没有成功。当我拥有 Post Entity 时,它显然具有正确的类别。如果变量名不同,您认为这应该有效吗?老实说,我真的不知道。我试试,谢谢:)
    • 好的。我对我的答案进行了编辑,因此请确保您也阅读了该内容。
    • 好的,感谢您的反馈,今晚我会尝试采纳您的建议并告诉您它的作用。谢谢
    • 也许我错了,但如果我从数据库中获取帖子,我将不得不更新每个可能从用户更新的字段(事实上,帖子中有 10 个属性实体)。而且, PostCategoryId 已更新,有关该字段的任何问题。如果我错了,请告诉我,但我将不得不避免请求类别,而是将其发布在帖子上。喜欢: :
    • 所以您的数据库中没有 Category 字段,对吗?然后,如果 PostCategoryId 正在更新,这意味着它工作正常。当您想获取帖子的类别时,您可以使用 PostCategoryId 字段来查找类别。或者,EntityFramework 应该能够检测到 PostCategoryId 字段是 Category 对象的外键。
    【解决方案2】:

    马特 S., 也许我错了,但是,如果我从数据库中获取帖子,我将不得不更新每个可能从用户更新的字段(事实上,帖子实体中有 10 个属性)。 而且, PostCategoryId 已更新,有关该字段的任何问题。如果我错了,请告诉我,但我将不得不避免请求类别,而是将其发布在帖子上。喜欢:

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

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

    但我认为我可以将类别“更新到帖子中”,并在需要时调用 post.Category。也许是我的误会?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多