新子对象未保存到数据库

时间:2015-10-09 11:29:55

标签: c# asp.net-mvc entity-framework dbcontext

我有Blog模型和BlogComment模型。博客可以有多个BlogComments。模型表示如下:

public class Blog
{
    public Guid BlogGuid { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }
    public string Author { get; set; }
    public DateTime DatePosted { get; set; }
    public virtual IList<BlogComment> Comments { get; set; }
}

public class BlogComment
{
    public Guid BlogCommentGuid { get; set; }
    public Guid BlogGuid { get; set; }
    public DateTime DatePosted { get; set; }
    public string Text { get; set; }
    public int ContactRef { get; set; }
    public ContactBase Contact { get; set; }
}

出于我的项目的目的,我没有像这样跟踪博客:

public Blog GetBlog(Guid guid)
{
   return context.Blogs.AsNoTracking().FirstOrDefault(b => b.BlogGuid == guid);
}

现在,在我的博客页面上,用户可以添加评论。所以我创建了一个新的注释并调用我的存储库InsertOrUpdate方法来保存博客。

public void InsertOrUpdateBlog(Blog blog)
{
    var blogExists = GetBlog(blog.BlogGuid) != null;
    if (blogExists)
    {
        var contextBlog = context.Blogs.Local.FirstOrDefault(b => b.BlogGuid == blog.BlogGuid);
        if (contextBlog != null)
        {
            context.Entry(contextBlog).CurrentValues.SetValues(blog);
        }
        else
        {
            context.Blogs.Attach(blog);
            context.Entry(blog).State = EntityState.Modified;
        }
    }
    else
    {
        context.Blogs.Add(blog);
    }
}

博客存在,但不在上下文中,因为此时没有被跟踪,所以它落入内部的其他区块,我正在重新附加博客并将其状态设置为修改。

我的博客服务调用此函数,然后保存更改:

public void InsertOrUpdateBlog(Blog blog)
{
    blogRepository.InsertOrUpdateBlog(blog);
    blogRepository.Save();

    string cacheKey = "Blog_" + blog.BlogGuid;
    cache.Remove(cacheKey);
}

blogRepository.Save()只需拨打context.SaveChanges()

我遇到的问题是新评论没有保存到数据库中,所以当我保存后再次拨打GetBlog时,新评论不存在。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

设置时:

context.Entry(blog).State = EntityState.Modified;

您标记博客实体,而不是它的导航属性。

如果某些导航属性已更改,则需要明确修改其状态。

恕我直言,添加评论值得另一种接受评论的方法,设置状态并保存。