У меня есть модель блога и модель 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
после того, как я сохранил, нового комментария там нет. Есть идеи?
Вы не сохраняете свои изменения. Последняя часть функции должна быть context.SaveChanges(); – whodares
Это происходит вне этой функции. Будет добавлено к вопросу. –
Является ли контекст внутри 'InsertOrUpdateBlog()' тем же экземпляром, что и в вашем методе 'Save()', если он не будет работать. Как вы создаете экземпляр вашего dbContext в своем blogRepository? – Luke