2016-07-03 5 views
0

Entity FrameworkからSQL Serverにデータを保存しようとしています。これは正常に動作し、私はここで間違って何が起こっているのかは分かりません。Entity Frameworkがデータを保存しません。

try 
    { 
     tblPortalCustomerInfo _custInfo = new tblPortalCustomerInfo(); 
     _custInfo = _da.GetCustById(new Guid("397E4A4B-CD89-43DC-9E70-C19FC27EE6E4")); 
     _custInfo.addressLine1 = tbaddress1.Text; 
     _custInfo.addressLine2 = tbaddress2.Text; 
     _custInfo.town = tbtown.Text; 
     _custInfo.county = "test"; 
     _custInfo.postcode = tbpostCode.Text; 
     _custInfo.email = tbEmail.Text; 
     _custInfo.phone = tbDayPhone.Text; 

     if(_custInfo.EntityState == System.Data.EntityState.Detached) 
     { 
      _da.portalEntities.tblPortalCustomerInfoes.AddObject(_custInfo); 
     } 

     _da.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 

私はコードをステップを持っているとエラーが生成されていないと、それはここでOKを取り付けたばかりされて、私のGetCustById機能

// <returns></returns> 
public tblPortalCustomerInfo GetCustById(Guid id) 
{ 
     try 
     { 
      tblPortalCustomerInfo _customerInfo; 

      _customerInfo = (from _custInfo in _dal.portalEntities.tblPortalCustomerInfoes  
          where _custInfo.id == id 
          select _custInfo).FirstOrDefault(); 

      //If the empNotes entity is null create a new one and attach it to the context. 
      if (_customerInfo == null) 
      { 
       _customerInfo = new tblPortalCustomerInfo(); 
       _dal.portalEntities.tblPortalCustomerInfoes.AddObject(_customerInfo); 
      } 

      return _customerInfo; 
     } 
     catch (Exception ex) 
     { 
      string inner = string.Empty; 

      if (ex.InnerException != null) 
      { 
       inner = ex.InnerException.ToString(); 
      } 

      return null; 
     } 
} 

マイポータルの実体はちょうど私のコンテキストベースオフ

public portalEntities1 _portalEntities; 

public portalEntities1 portalEntities 
{ 
    get 
    { 
      if (_portalEntities == null) 
      { 
       try 
       { 
        _portalEntities = new portalEntities1(); 
       } 
       catch (Exception ex) 
       { 
       } 
      } 

      return _portalEntities; 
    } 
} 
です

あなたが言う前に私はポストバックチェックをしていますはい私のページの負荷でここにいます

protected void Page_Load(object sender, EventArgs e) 
{ 
      /****** Script for SelectTopNRows command from SSMS ******/ 
      /****** Script for SelectTopNRows command from SSMS ******/ 
      tblPortalCustomerInfo _myCustomerInfo = _da.GetCustById(new Guid("397E4A4B-CD89-43DC-9E70-C19FC27EE6E4")); 

      if (!IsPostBack) 
      { 
       tbaddress1.Text = _myCustomerInfo.addressLine1; 
       tbaddress2.Text = _myCustomerInfo.addressLine2; 

       tbtown.Text = _myCustomerInfo.town; 
       tbpostCode.Text = _myCustomerInfo.postcode; 
       tbMobile.Text = _myCustomerInfo.mobile; 
       tbEmail.Text = _myCustomerInfo.email; 
       tbLandLine.Text = _myCustomerInfo.phone; 
      } 
} 

私のコンテキストベース

public portalEntities1 _portalEntities; 

public portalEntities1 portalEntities 
{ 
    get 
    { 
     if (_portalEntities == null) 
     { 
      try 
      { 
       _portalEntities = new portalEntities1(); 
      } 
      catch (Exception ex) 
      { 
      } 
     } 

     return _portalEntities; 
    } 
} 

であるマイポータルのエンティティのプロパティは、私は情報がちょうどデシベル何らかの理由で誰もが任意のアイデアを持って

注1

に保存されていないエラーを取得していません

私はef5を使用していますので、これは論理的に見えるオブジェクトの状態を変更する正しい方法です

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     tblPortalCustomerInfo _custInfo = new tblPortalCustomerInfo(); 
     _custInfo = _da.GetCustById(new Guid("397E4A4B-CD89-43DC-9E70-C19FC27EE6E4")); 
     _custInfo.addressLine1 = tbaddress1.Text; 
     _custInfo.addressLine2 = tbaddress2.Text; 
     _custInfo.town = tbtown.Text; 
     _custInfo.county = "test"; 
     _custInfo.postcode = tbpostCode.Text; 
     _custInfo.email = tbEmail.Text; 
     _custInfo.phone = tbDayPhone.Text; 

     _da.portalEntities.ObjectStateManager.ChangeObjectState(_custInfo, System.Data.EntityState.Modified); ----> is this correct for ef5 

     _da.SaveChanges(); 
    } 
} 

私は上記の方法をしようとすると、私が投げ

例外を提示しています:System.Data.Entity.dll追加情報の「System.InvalidOperationExceptionが」:ObjectStateManagerはを参照してObjectStateEntryが含まれていませんタイプ「portalef.tblPortalCustomerInfo」のオブジェクトです。あなたが特定のIDを持つ顧客を検索し、顧客が存在しない場合は、あなたがそれを作成し、呼び出しcode.Eitherの道に戻すGetCustByIdと呼ばれる関数の内部

+2

問題を再現している最小限のコードで質問を提供するとよいでしょう。また空の 'try'-' catch 'ブロックは良い方法ではありません。ここでできることは、Debug-Exceptionsに行き、** CLR Exceptions **のチェックボックスをオンにします。その後、スローされた例外はすべてデバッグモードで表示されます。また、ステップバイステップのログを実装して、どこでクラッシュするかを確認することもできます。なぜそのコードがエンティティを現在保存していないのかを側面の観点から言うのは難しいです。 –

+0

@IvanYurchenkoこんにちは申し訳ありませんが、そのオプションは – rogue39nin

+0

です。「Ctrl + D、E」を押し、** CLR Exceptions **の下に「投げられた」と「未処理の」オプションの両方をチェックします。これはスローされたが、 'catch'ブロック例外によって処理されることを決定するのに役立ちます。 –

答えて

1

顧客がすでにデータベースに存在し、 AddObject()を呼び出すと、データベースにエントリが作成されますまだ存在していない場合

+0

はい、それは良いキャッチですが、エンティティがデタッチされているかどうかはわかりませんが、 – rogue39nin

+0

あなたの言うことはありませんか? – rogue39nin

+0

コンテキストに応じてデタッチされても問題ありません。実際には、データベース内にエントリが存在し、AddObject()を呼び出すと挿入できません。このレコードを挿入する別の方法を見つける必要があります。 Add()を呼び出すが、プライマリキーフィールドをクリアする必要がある場合は、このPKのエントリが既に存在するというエラーが表示されます。 –

関連する問題