Entity Framework - PullRequest
       6

Entity Framework

3 голосов
/ 06 марта 2011

Я занимаюсь веб-приложением MVC 3, и у меня странная проблема.Вот некоторый код:

Объявление модели:

public class Project
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Write a title.")]
    public string Title { get; set; }

    public DateTime TimeAdded { get; set; }

    [Required(ErrorMessage = "Write some description.")]
    [MaxLength(int.MaxValue)]
    public string Content { get; set; }

    public ICollection<Comment> Comments { get; set; }
}   

public class Comment
{
    public int ID { get; set; }

    [Required()]
    public int ProjectID { get; set; }

    public DateTime TimeAdded { get; set; }

    [Required()]
    public string Text { get; set; }

    public Project project { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    dataDBContext db = new dataDBContext();

    //
    // GET: /Home

    public ActionResult Index()
    {
        var comments = from c in db.Comments
                       select c;

        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;

        return View(projects.ToList());
    }
  1. Когда я запускаю проект, комментарии не видны на моем виде.
  2. Я устанавливаю точку останова сразу после обоих запросов linq, отладки и проверки полей переменных проекта. Комментарии, они не заполняются.Затем я проверяю переменную "comments", в ней есть некоторые данные.Повторная проверка переменных проекта и полей SOMEHOW. Комментарии заполняются, и, наконец, комментарии появляются на веб-сайте.Если я не установлю точку останова и не проверю, заполнена ли переменная "comments", они не появятся на сайте.(Надеюсь, это понятно)
  3. Я нашел простой обходной путь:

    public ActionResult Index()
    {
        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;
    
        foreach (var p in projects)
        {
            var comments = from c in db.Comments
                           where c.ProjectID == p.ID
                           select c;
    
    
            p.Comments = comments.ToList();
        }
    
        return View(projects.ToList());
    }
    

    , но похоже (в соответствии с пунктом 2), что это может быть автоматически заполнено.*

Есть ли способ сделать это?


Еще одна попытка, основанная на данных ответах:

public class HomeController : Controller
{
    dataDBContext db;

    public HomeController()
    {
        db = new dataDBContext();
        db.Configuration.LazyLoadingEnabled = false;
    }

    //
    // GET: /Home

    public ActionResult Index()
    {
        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;

        return View(projects.ToList());
    }

У меня есть внешний ключ.Я добавил LazyLoadingEnabled.Существует project.ToList (), и он не работает.

Основываясь на втором ответе, я сделал нечто подобное:

public class HomeController : Controller
{
    dataDBContext db;

    public HomeController()
    {
        db = new dataDBContext();
    }

    //
    // GET: /Home

    public ActionResult Index()
    {
        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;

        var comments = from c in db.Comments
                       select c;

        List<Comment> l = comments.ToList();

        return View(projects.ToList());
    }

Я добавил только comments.ToList () иэто работает.Но я не уверен, что это правильное решение.Вероятно, лучше, чем мой обходной путь (пункт 3).Есть предложения?

Спасибо

Ответы [ 2 ]

5 голосов
/ 06 марта 2011

Если у вас есть внешний ключ между комментариями и проектами, вы можете сделать что-то вроде этого

db.ContextOptions.LazyLoadingEnabled = false;
var projects = from p in db.Projects.Include("Comments")
                       orderby p.TimeAdded descending
                       select p;

Он загрузит все комментарии для всех проектов, когда вы выполните .ToList (). Вы сможете получить доступ к данным с помощью свойства навигации «Комментарии» объекта проекта.

0 голосов
/ 06 марта 2011

Когда вы остановились на точке останова и изучили результаты запроса, вы эффективно запускаете выполнение «ToList», поэтому ваш новый код выполняет , выполняя то же автоматическое заполнение, что и сеанс отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...