1

少し奇妙なエラーが発生し、少し困惑したので、絵を描いてみましょう。

家のレビューでデータベースを更新するコントローラーがあります。家が存在しない場合は、家を作成してから更新します。

したがって、これは家が存在しない場合のコードです。

if (checkHouse == null)
{
        var department = db.Universitys.Single(d => d.universityName == "NotSet");//make dynamic
        var hws = new House();
        hws.address1 = reviewmodelview.Address1;
        hws.address2 = reviewmodelview.Address2;
        hws.postCode = reviewmodelview.postCode;
        hws.noOfDisputes = 0;
        department.Houses.Add(hws);
        db.SaveChanges(); //created the house and saved the changes, now apply the review to it.

        var theHouse = db.Houses.Single(d => d.address1 == reviewmodelview.Address1);//findhouse
        var rvw = new Review(); //create review
        rvw.condition = reviewmodelview.condition;
        rvw.furniture = reviewmodelview.furniture;
        rvw.overall = reviewmodelview.overall;
        rvw.isApproved = false;
        rvw.review = reviewmodelview.review;
        rvw.user = User.Identity.Name;
        rvw.reviewDate = DateTime.Now;
        theHouse.Reviews.Add(rvw);
        db.SaveChanges();
}

家が存在するかどうかのコードは次のとおりです。

else
{
    var theHouse = db.Houses.Single(d => d.address1 == reviewmodelview.Address1);//findhouse
    var rvw = new Review();//create review
    rvw.condition = reviewmodelview.condition;
    rvw.furniture = reviewmodelview.furniture;
    rvw.overall = reviewmodelview.overall;
    rvw.isApproved = false;
    rvw.review = reviewmodelview.review;
    rvw.user = User.Identity.Name;
    rvw.reviewDate = DateTime.Now;
    theHouse.Reviews.Add(rvw);
    db.SaveChanges();
}

問題はこれです。家が存在する場合は、レビューが追加されます。家が存在しない場合、家はデータベースに追加されますが、コードは次の場所で壊れます。

theHouse.Reviews.Add(rvw); 

また、マウスを[レビュー]に合わせると、nullと表示されます。エラーは「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。

ただし、もう一度試してみると、今回はデータベースにすでに存在する家の住所を追加し、にブレークポイントを追加します。

theHouse.Reviews.Add(rvw);

それは言う:{System.Data.Objects.DataClasses.EntityCollection<Data.Manager.Review>}

2つの同一のコードについて、レビューコレクションがnullである理由がわかりません。

家のモデルはこれです:

namespace Data.Manager
{
    public class House
    {
        public virtual int HouseID { get; set; }
        public virtual string postCode { get; set; }
        public virtual string address1 { get; set; }
        public virtual string address2 { get; set; }
        public virtual int noOfDisputes { get; set; } //number of disputes added by tennants
        public virtual int averageRating { get; set; }
        public virtual ICollection<Review> Reviews { get; set; }        
    }
}

なぜそうなっているのか説明が取れたら、いつまでもあなたを愛していきたいと思います。

4

3 に答える 3

6

で新しい家を作成する場合はICollection<Review> Reviews、を使用する前にそれを初期化する必要がありますReviews.Add。すでに存在する家で機能する理由は、既存の家をロードすると、コレクションが初期化され、既存の値が入力されるためです。

theHouse.Reviews = new List<Review>();に電話をかける前に、に沿って何かをする必要がありますtheHouse.Reviews.Add。のコンストラクター内でこれを事前にHouse初期化して、アクセスが試行される前に初期化されるようにすることもできます。

于 2013-02-22T15:47:34.773 に答える
2

Houseコンストラクターでこのようなレビューのコレクションを初期化してみてください

namespace Data.Manager
{
    public class House
    {
        public House()
        {
          Reviews = new List<Review>();
        }

        public virtual int HouseID { get; set; }
        public virtual string postCode { get; set; }
        public virtual string address1 { get; set; }
        public virtual string address2 { get; set; }
        public virtual int noOfDisputes { get; set; } //number of disputes added by tennants
        public virtual int averageRating { get; set; }
        public virtual ICollection<Review> Reviews { get; set; }        
    }
}
于 2013-02-22T15:57:30.187 に答える
0

前の回答で述べたように、アイテムを追加する前に、Reviewsオブジェクトを初期化する必要があります。

DBを2回呼び出す代わりに、変更を1回だけ保存することで、コードを少し改善できます。

        if (checkHouse == null)
        {

            var department = db.Universitys.Single(d => d.universityName == "NotSet");//make dynamic
            var hws = new House();
            hws.address1 = reviewmodelview.Address1;
            hws.address2 = reviewmodelview.Address2;
            hws.postCode = reviewmodelview.postCode;
            hws.noOfDisputes = 0;
            hws.Reviews = new List<Review>();

            var rvw = new Review(); //create review
            rvw.condition = reviewmodelview.condition;
            rvw.furniture = reviewmodelview.furniture;
            rvw.overall = reviewmodelview.overall;
            rvw.isApproved = false;
            rvw.review = reviewmodelview.review;
            rvw.user = User.Identity.Name;
            rvw.reviewDate = DateTime.Now;
            hws.Reviews.Add(rvw);
            department.Houses.Add(hws);

            db.SaveChanges();

        }
于 2013-02-22T15:56:05.350 に答える