2017-01-09 22 views
0

私は問題があり、他の解決策を探して解決できませんでした。問題は、ユーザーからアプリケーションを入手することです。アプリケーションは異なる状態になることがあります。アプリケーション自体をAPPLICATIONテーブルに保持し、アプリケーションの状態をAPPLICATIONSTATEテーブルに保持します。ユーザーがアプリケーションを提出すると、デフォルトのアプリケーション状態値がアプリケーション状態テーブルに書き込まれます。時間の間、アプリケーションの状態は変更され、各変更はAPPLICATIONSTATEテーブルに書き込まれます。プロパティ 'APPLICATIONID'はオブジェクトのキー情報の一部であり、変更することはできません

私はEntity Frameworkのデータベース最初のアプローチ、(OracleのEF)を使用し、ここに私のデータベースのER図である午前:

public partial class APPLICATION 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public APPLICATION() 
    { 
     this.APPLICATIONSTATE = new HashSet<APPLICATIONSTATE>(); 
    } 

    public int APPLICATIONID { get; set; }  

    public System.DateTime APPLICATIONDATE { get; set; } 

    public short PROVINCEID { get; set; } 
    public Nullable<short> ILCEID { get; set; } 
    public decimal AREA { get; set; } 
    public bool ISBASEMENTOK { get; set; } 
    public string APPLICATIONEXPLAINATION { get; set; } 

    public virtual PERSONEL LOJ_PERSONEL { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<APPLICATIONSTATE> LOJ_APPLICATIONSTATE{ get; set; } 

} 

public partial class APPLICATIONSTATE 
{ 
    public long APPLICATIONSTATEID { get; set; } 
    public int APPLICATIONENUM { get; set; } 
    public System.DateTime CURRENTTIME { get; set; } 

    public virtual APPLICATION LOJ_APPLICATION { get; set; } 
    public virtual USER LOJ_USER { get; set; } 
} 
:ここ

database er diagram

は、Entity Frameworkで生成された部分クラスであります

私はリポジトリパターンを使用しています。新しいアプリケーションとアプリケーションの状態を追加しようとするコードセクションは次のとおりです。

int applicationId = int.minvalue; 

    USER myuser = null; 

    APPLICATION myApplication = this.gettingFromSomewhere(); 

    using (HousingEntities model = new HousingEntities()) 
    { 
     applicantuser = model.LOJ_PERSONEL.FirstOrDefault(p => p.PERSONELID == YeniBasvuru.PersonelId); 
     myApplication.LOJ_USER = applicantuser; 
     model.APPLICATION.Add(myApplication); 
     //saving the application 
     model.SaveChanges(); 

     //getting the primary key of newly created application object from database. 
     applicationId = this.getMostCurrentIdOfApplication(); 
     myApplication.APPLICATIONID = applicationId; 

     //getting the user that submits application 
     applicant = model.USER.FirstOrDefault(p => p.LOJ_USER.USERID == myApplication.LOJ_PERSONEL.USERID); 

     //if clause-1 
     if(applicant != null) 
     { 
      //saving the state of the application. 
      appState = new APPLICATIONSTATE(); 

      //3 is the default state for application. When we need to change it to 4, newly row will be added. 
      appState.APPLICATIONSTATEID = 3; 
      appState.LOJ_APPLICATION = myApplication; 
      appState.LOJ_USER = applicant; 

      //I am getting an error here. 
      model.APPLICATIONSTATE.Add(appState); 
      model.SaveChanges(); 
     } 
    } 

    result.TransactionResult = true; 
    result.rowId = applicationId; 

} 
//other catches removed for clarity.  
catch (Exception ex) 
{ 
    islemSonuc = new FunctionResult (ex, this._olasihataciddiyeti); 
    this.writeError(ex); 
} 

上記の行にエラーが表示されますプロパティ 'APPLICATIONID'はオブジェクトのキー情報の一部であり、変更できません。エラー。このエラーを克服するにはどうすればよいですか?前もって感謝します。

どうすればこのエラーを解決できますか?前もって感謝します。

+3

問題は 'myApplication.APPLICATIONID = applicationId;'です。 'myApplication.APPLICATIONID'はデータベースによって自動生成され、その呼び出しは必要ありません。** ** model.APPLICATION.Add(myApplication);の前にこれを行う必要があります。 –

+0

Ivan、これはポイントではありません。 applicationIdはデータベースから取得されており、if節を削除するとコードはエラーなく実行されます。 – tahasozgen

+0

どのif節?内部にSaveChangesを持つもの? –

答えて

0

Ivan Stoev氏のソリューションは正しいです。上のコードでは、

appState.LOJ_APPLICATION = myApplication;

はエラーです。私たちはエンティティのプライマリキーを設定するだけで割り当てを行い、データベースには行っていません。したがって、EFは主キー情報とのみ一致することはできません。また、バックグラウンドで追加情報が必要です。私たちは以下のようにコードを変更するのであれば、:

あるmyApplication = model.APPLICATIONた(p => p.APPLICATIONID == APPLICATIONID)今

、あるmyApplicationは、データベースから最も新鮮な情報が含まれています。それを割り当てると、EFはエンティティに一致することができます。

関連する問題