为什么我的通用列表总是为空?

时间:2013-03-30 00:01:07

标签: c# asp.net-mvc entity-framework list

我有这样的课程:

public class Lugar
{
    [Key]
     public int LugarId { get; set; }


    public List<Review> Reviews { get; set; }
    public int SumReviews { get; set; }

    public double AverageReviews { get {

        if (Reviews == null)
            return 0;

        else if (Reviews.Count == 0)
            return 0;

        else  
        return (double)SumReviews/(Reviews.Count); } }


}

在我的控制器中我有这个:

 [HttpPost, Authorize]
    public ActionResult WriteReview(int id, FormCollection formCollection)
    {

        Lugar lugar = db.Lugares.Find(id);
                    Review review=new Review();
        review.User = User.Identity.Name;
        review.Rating=Convert.ToInt32(formCollection["Rating"]);
        review.Texto = formCollection["Review"];
        if (lugar != null)
        {
            if(  lugar.Reviews==null)
            lugar.Reviews=new List<Review>();

            lugar.Reviews.Add(review);
            lugar.SumReviews += review.Rating;
            db.SaveChanges();

        }

        else
            return RedirectToAction("Index");



        return RedirectToAction("Index");
    }


}

问题在于:

if(lugar.Reviews == null) lugar.Reviews = new List();

每次执行我都会得到(lugar.Reviews == null)为真......

即使我已经为该地方添加了评论,if语句也会返回true .....

3 个答案:

答案 0 :(得分:2)

尝试使用'virtual'关键字来声明你的List,看看你是否还有运气。

答案 1 :(得分:0)

您可能希望在Lugar类中引入构造函数并在那里实例化列表。 像这样:

public void Lugar()
{
   Reviews = new List<Review>();
}

希望这会有所帮助。请不要告诉我。

P.S。另一件与你的具体问题无关的事情,但肯定是改进是使用视图模型而不是FormCollection。

它将以一种主要方式简化您的生活。有关如何使用它的示例,请查看此成功回答的问题:What is ViewModel in MVC?

答案 2 :(得分:0)

这里有2个选项,延迟加载(通过将虚拟放在导航属性上启用)当您在C#中访问属性时,这将取消您的第二个权限 或者在查询中使用.Include(/*lambda or string property name*/)语句急切加载。

我个人认为,由于您可以更好地控制何时加载实体

,因此我会提供预先加载