0

私はこのようなクラスを持っています:

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) が true になります.....

その場所のレビューを既に追加している場合でも、if ステートメントは true を返します.....

4

3 に答える 3

2

リストを宣言する場所で 'virtual' キーワードを使用してみて、さらにうまくいくかどうかを確認してください。

于 2013-03-30T00:15:28.593 に答える
0

Lugarクラスにコンストラクターを導入し、そこでリストをインスタンス化することができます。このようなもの:

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

お役に立てれば。ないか教えてください。

PS 特定の質問とは関係ありませんが、確かに改善は FormCollection ではなくビューモデルを使用することです。

それはあなたの人生を大幅に簡素化します。使用方法の例については、この成功した回答の質問を見てください: MVC の ViewModel とは何ですか?

于 2013-03-30T00:07:42.027 に答える
0

.Include(/*lambda or string property name*/)ここには 2 つのオプションがあります。遅延読み込み (ナビゲーション プロパティに virtual を配置することで有効になります)。これにより、C# でプロパティにアクセスするとき、またはクエリでステートメントを使用して熱心な読み込みを行うときに、2 番目のエンティティがプルダウンされます。

個人的には、エンティティが読み込まれるタイミングをより細かく制御できるため、熱心な読み込みを好みます

于 2013-03-30T00:20:54.873 に答える