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

本文关键字:列表 我的 为什么 | 更新日期: 2023-09-27 18:06:47

我有一个这样的类:

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");
    }

}

问题在这一行:

如果(lugar.Reviews = = null)卢格。评论=新列表();

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

即使我已经为那个地方添加了一个Review, if语句返回true.....

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

尝试使用'virtual'关键字声明您的列表,看看您是否有更多的运气。

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

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

希望这对你有帮助。如果不行,请告诉我。

注:另一件事是不相关的具体问题,但肯定是一个改进是使用视图模型,而不是FormCollection。

它将在很大程度上简化你的生活。例如,如何使用它,请看看这个成功回答的问题:什么是MVC中的ViewModel ?

你在这里有2个选项,延迟加载(通过在导航属性上添加virtual来启用)这将在c#中访问该属性时拉下你的第二个实体或者在查询中使用.Include(/*lambda or string property name*/)语句进行即时加载。

我个人更喜欢急切加载,因为你可以更好地控制何时加载实体