我有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
时,新评论不存在。有什么想法吗?
答案 0 :(得分:2)
设置时:
context.Entry(blog).State = EntityState.Modified;
您标记仅博客实体,而不是它的导航属性。
如果某些导航属性已更改,则需要明确修改其状态。
恕我直言,添加评论值得另一种接受评论的方法,设置状态并保存。