我有这样的课程:
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 .....
答案 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*/)
语句急切加载。
我个人认为,由于您可以更好地控制何时加载实体
,因此我会提供预先加载