2015-10-09 2 views
0

У меня есть модель блога и модель 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

Вы не сохраняете свои изменения. Последняя часть функции должна быть context.SaveChanges(); – whodares

+0

Это происходит вне этой функции. Будет добавлено к вопросу. –

+0

Является ли контекст внутри 'InsertOrUpdateBlog()' тем же экземпляром, что и в вашем методе 'Save()', если он не будет работать. Как вы создаете экземпляр вашего dbContext в своем blogRepository? – Luke

ответ

2

Когда вы настраиваете:

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

Помяни только блог сущности, не это навигационные свойства.

Если какое-либо свойство навигации было изменено, вам необходимо явно изменить его состояние.

IMHO, добавляя комментарии, заслуживает другого метода, который принимает комментарий, устанавливает его состояние и сохраняет.