2015-08-03 1 views
1

Мой News.cs класс имеет один ко многим отношений с Comment.cs, как определено нижезначение не может быть пустым в Entity Sql Заявление

public class News 
{ 
    public int NewsId { get; set; }  
    [Display(Name = "Title")] 
    public string Title { get; set; }  
    [Display(Name = "Details")] 
    public string Details { get; set; }  
    public DateTime DateCreated { get; set; }  
    public int AppUserId { get; set; } 
    [ForeignKey("AppUserId")] 
    public virtual AppUser AppUser { get; set; } 
    public ICollection<Comment> Comment { get; set; } 
} 
public class Comment 
{ 
    public int CommentId { get; set; } 
    public string CommentText { get; set; } 
    public DateTime DateCreated { get; set; } 
    public int AppUserId { get; set; } 
    public int? NewsId { get; set; } 
    [ForeignKey("AppUserId")] 
    public virtual AppUser AppUser { get; set; } 
    [ForeignKey("NewsId")] 
    public virtual News News { get; set; } 
} 

У меня есть действия контроллера, где я пытаюсь принести один пункт новостей наряду со всеми его замечания, так что я создал два ViewModels как этот

public class CommentVM 
{  
    public string CommentText { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Author { get; set; }  
} 
public class NewsCommentsVM 
{ 
    [Display(Name = "Title")] 
    public string Title { get; set; } 
    [Display(Name = "Details")] 
    public string Details { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Author { get; set; } 
    public List<CommentVM> Comments { get; set; } 
} 

В моем действии контроллера у меня есть

public ActionResult Details(int? id) 
{ 
    UOW _unit = new UOW(); 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    News news = _unit.NewsRepository.GetByID(id); 

    if (news == null) 
    { 
     return HttpNotFound(); 
    } 
    var model = new NewsCommentsVM() 
    { 
     Title = news.Title, 
     Details = news.Details, 
     DateCreated = news.DateCreated, 
     Author = news.AppUser.FirstName 
     Comments = news.Comment.Select(c => new CommentVM() 
     { 
      CommentText = c.CommentText, 
      Author = c.AppUser.Email, 
      DateCreated = c.DateCreated 
     }).ToList() 

    }; 
    return View(result); 

} 

Проблема заключается в том, что отладчик показывает, что комментарий возвращается Null, тогда как в базе данных имеются соответствующие комментарии к этому конкретному пункту новостей, так что я получаю ошибку

Значение не может быть пустым. Параметр: источник

Я был в состоянии использовать этот код в другом проекте без проблем.

ответ

2

Я думаю, проблема в том, что вам необходимо изменить свойство коллекции Comments как virtual. Если вы хотите, что соответствующие объекты поленитесь загружены, вы должны следовать этому requirements:

public class News 
{ 
    //... 
    public virtual ICollection<Comment> Comment { get; set; } 
} 

Теперь, если вы отключили lazy loading, другой вариант может быть с помощью метода Include расширения в запросе, когда вам нужно найти частности новости:

int id=3; 
var specificNews=context.News.Include(n=>n.Comment).FirstOrDefault(n=>n.Id==id); 

Таким образом, соответствующий объект будет включен в результате запроса