2011-08-07 6 views
1

フレームワーク:私はMVC 3 + EntityFramework 4.1 Code-Firstを使用しています。親を保存した後に一対多のリレーションシップアイテムを含めるときにNullReferenceExceptionが発生する

概念: 1つの法規エンティティには、多くのプロビジョニングエンティティがあります。アイデアは、ユーザが立法エンティティに入ったときに保存され、それを保存する関数がそれを別の関数に渡して、その立法がShortTitleを持っているかどうかを確認することです。そうであれば、それは適切に言及された文字列にフォーマットされ、法律の最初の規定としてそれを組み込み、変更をdbに保存します。

問題:問題は、私はさまざまな方法でそれをコード化しようとした、である、私は「新しい」キーワードで新しいオブジェクトインスタンスを作成するために私に言って、とNullReferenceExceptionを取得しておくと、savedLegislation.Provisions.Add(provision);ラインに私を指します私の2番目の機能です。

public Legislation Save(NewLegislationView legislation) 
{ 
    Legislation newLegislation = new Legislation(); 
    // Simple transfers 
    newLegislation.ShortTile = legislation.ShortTile; 
    newLegislation.LongTitle = legislation.LongTitle; 
    newLegislation.BillType = legislation.BillType; 
    newLegislation.OriginatingChamber = legislation.OriginatingChamber; 
    newLegislation.Preamble = legislation.Preamble; 

    // More complicated properties 
    newLegislation.Stage = 1; 
    this.NumberBill(newLegislation); // Provides bill number 
    newLegislation.Parliament = db.LegislativeSessions.First(p => p.Ending >= DateTime.Today); 
    newLegislation.Sponsor = db.Members.Single(m => m.Username == HttpContext.Current.User.Identity.Name); 

    // And save 
    db.Legislations.Add(newLegislation); 
    db.SaveChanges(); 

    // Check for Short titles 
    this.IncludeShortTitle(newLegislation); 

    // return the saved legislation 
    return newLegislation; 
} 

そしてShortTitleが空でないかどうかをチェックし、引当金を作成すると最初の取引によって呼び出される第二の機能:ここで

が問題に2つの機能であり、この最初のものは、適切な立法を節約しますその法律に関連している場合は、変更を保存します。

public void IncludeShortTitle(Legislation legislation) 
{ 
    var savedLegislation = db.Legislations.Find(legislation.LegislationID); 
    if (savedLegislation.ShortTile.Any() && savedLegislation.ShortTile.ToString().Length >= 5) 
    { 
     string shortTitle = "This Act may be cited as the <i>" + savedLegislation.ShortTile.ToString() + "</i>."; 
     var provision = new Provision() 
     { 
      Article = Numbers.CountOrNull(savedLegislation.Provisions) + 1, 
      Proponent = savedLegislation.Sponsor, 
      Text = shortTitle 
     }; 
     savedLegislation.Provisions.Add(provision); 
     db.SaveChanges(); 
    } 
} 

私はどのようにSaveChanges()作品を研究してきましたし、それかどうかを適切に更新エンティティを返して、それがない(私は第二の機能でそれを見て何の問題を取得していないので)。それが適切に機能し、法律が見つかって第2の機能で新たに条項が作成された場合、私は何が「零」なのか分かりません。

答えて

0

この場合、ヌル参照はsavedLegislation.Provisionsになります。 インスタンスがdb.Legislations.Find(...)メソッドから返された場合、Provisionsコレクションは新しいList<Provision>に初期化されません。

私が試してみた最初のものは、このようなものです:

var savedLegislation = db.Legislations 
    .Include("Provisions") 
    .First(l => l.LegislationID == legislation.LegislationID); 

...しかし、私はまたちょうどメソッドに渡されたlegislationインスタンスを使用してではなく、データベースからフェッチ検討したいです再び。

+0

他の関数から 'legislation'オブジェクトを渡そうとしましたが、それは私に同じ問題を与えました。私は 'db.Legislations.Find(...)'を2番目の関数に追加して、それが機能するかどうかをテストしました。残念ながらそれはしません。あなたが今提供したコードを試してみましょう! – cyehia

+2

@cyehiaああ、もちろん。あなたが渡す '立法(legislation) 'のインスタンスは、手で新しくされて以来同じ問題を抱えています。前の方法でインスタンスを作成するときはいつでも 'legislation.Provisions = new List ()'を設定することができます。 –

+0

私は 'newLegislation.Provisions = new List ();'というnewLislationを追加する前に、最初の関数に行を追加しました。私はまた、2番目の関数でデータベースフェッチを削除し、最初の関数から '立法'を渡しました。今度は 'db.SaveChanges()'のマークで、私の外部キーを定義する必要があるという例外があります。私のプロビジョニングモデルでは、「public virtual legislation legislation {get;セット; } ' - 十分ではないでしょうか?または、私は 'public仮想intが必要ですか?LegislationID {get; set;} 'これが正しく動作するための行?あなたの助けにマットありがとう! – cyehia

関連する問題