2016-05-17 9 views
1

私のテーブルにはこの関係があります。 Activity, Workstation, Platform, Partはルックアップテーブルです。MVC4 EF親が挿入されていない場合、子がある場合

ActivityおよびWorkstationテーブルへの(ActivityId、WorkstationId)外部キーを含むActivitWorkstationがあります。

また、PlatformPartには、(PlatformId、PartId)外部キーがPlatformPartテーブルに含まれています。

は、最後に私は(ActivityWorkstationId、PlatformPartId) ActivityWorkstationPlatformPartテーブルへの外部キーを持っている PartStagingテーブルを持っています。

私のPartStagingコントローラでは、Createメソッドで、ユーザーはアクティビティ、ワークステーション、プラットフォーム、およびパートをドロップダウンから選択します。

私のPartStagingコントローラでは、HttpPost Createメソッドで、ActivityWorkstationレコードとPlatformPartレコードが存在するかどうかをチェックする必要があります。そうでない場合は、挿入して、PartStagingレコードを挿入します。私はこれは親レコード(ActivityWorkstationおよび/またはPlatformPart記録)が存在しないことによって引き起こされ知っ

Object reference not set to an instance of an object. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object. 

Source Error: 
Line 243:   } 
Line 244:    
Line 245:   var activityWorkstationId = db.ActivityWorkstations.Where(aw => aw.ActivityId == partstagingvm.ActivityId && aw.WorkstationId == partstagingvm.WorkstationId).FirstOrDefault().Id; 
Line 246:   var platformPartId = db.PlatformParts.Where(pp => pp.PlatformId == partstagingvm.PlatformId && pp.PartId == partstagingvm.PartId).FirstOrDefault().Id; 
Line 247: 

:私はこのエラーを取得しています

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(PartStagingVM partstagingvm) 
{ 
    if (ModelState.IsValid) 
    { 
     PartStaging partstaging = new PartStaging(); 

     if(!db.ActivityWorkstations.Any(aw => aw.ActivityId == partstagingvm.ActivityId && aw.WorkstationId == partstagingvm.WorkstationId)) 
     { 
      ActivityWorkstation aw = new ActivityWorkstation(); 

      aw.ActivityId = partstagingvm.ActivityId; 
      aw.WorkstationId = partstagingvm.WorkstationId; 

      db.ActivityWorkstations.Add(aw); 
      db.Entry(aw).State = EntityState.Added; 
     } 

     if(!db.PlatformParts.Any(pp => pp.PlatformId == partstagingvm.PlatformId && pp.PartId == partstagingvm.PartId)) 
     { 
      PlatformPart pp = new PlatformPart(); 

      pp.PlatformId = partstagingvm.PlatformId; 
      pp.PartId = partstagingvm.PartId; 

      db.PlatformParts.Add(pp); 
      db.Entry(pp).State = EntityState.Added; 
     } 

     var activityWorkstationId = db.ActivityWorkstations.Where(aw => aw.ActivityId == partstagingvm.ActivityId && aw.WorkstationId == partstagingvm.WorkstationId).FirstOrDefault().Id; 
     var platformPartId = db.PlatformParts.Where(pp => pp.PlatformId == partstagingvm.PlatformId && pp.PartId == partstagingvm.PartId).FirstOrDefault().Id; 

     partstaging.ActivityWorkstationId = activityWorkstationId; 
     partstaging.PlatformPartId = platformPartId; 

     db.PartStagings.Add(partstaging); 
     db.SaveChanges(); 
    } 

    return View(partstagingvm); 
} 

:以下は私のコードです。

PartStagingに挿入する前に親レコードを挿入する方法を教えてください。

答えて

1

外部キーを取得する必要はありません。なぜなら、Entity Frameworkはスマートなので、外部キーを取得する必要はありません。したがって、ナビゲーションプロパティを取得し、それが存在しない場合は作成します。あなたがPartStagingで適切なナビゲーションプロパティを持っているとしたら、次のようなことをします:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(PartStagingVM partstagingvm) 
{ 
    if (ModelState.IsValid) 
    { 
     var activityWS = db.ActivityWorkstations 
          .FirstOrDefault(aw => aw.ActivityId == partstagingvm.ActivityId 
               && aw.WorkstationId == partstagingvm.WorkstationId); 
     if (activityWS == null) 
     { 
      // If we get here EF will add this item, otherwise uses the found version 
      activityWS = new ActivityWorkstation 
         { 
          partstagingvm.ActivityId, 
          partstagingvm.WorkstationId 
         }; 
     } 

     var platformPart= db.PlatformParts 
          .FirstOrDefault(pp => pp.PlatformId == partstagingvm.PlatformId 
                && pp.PartId == partstagingvm.PartId); 

     if (platformPart == null) 
     { 
      platformPart = new PlatformPart 
          { 
           partstagingvm.PlatformId, 
           partstagingvm.PartId 
          }; 
     } 

     PartStaging partstaging = new PartStaging 
            { 
             ActivityWorkstation = activityWS, // Set navigation property 
             PlatformPart = platformPart 
            }; 

     db.PartStagings.Add(partstaging); 
     db.SaveChanges(); 
    } 

    return View(partstagingvm); 
} 
+0

これは機能します。どうもありがとうございます。 – Eric

関連する問題