2017-10-18 3 views
0

私はcurrentAppointmentを予定に複製しようとしています。私の問題は、currentAppointmentにGUIDがあることです。新しい重複予定を作成しようとすると、次のエラーが表示されます。 'プロパティ' AppID 'はオブジェクトのキー情報の一部であり、変更することはできません。 'オブジェクトの主要情報です。変更することはできません。

これはなぜ私がこのエラーを受けているのかを完全に理解していて、私はフィールドごとにフィールドを移動し、それらを一致させることができることを知っています(32フィールド)。しかし、任命 '新しいフィールドは、フィールドごとにフィールドを移動せずに。

 Appointment currentAppointment = db.Appointments.Find(id); 

     Appointment appointment = currentAppointment; 

     appointment.AppID = Guid.NewGuid(); (where I get the error since I already have a guid from currentAppointment but would like appointment to have a new one.) 
     appointment.AgentID = 1; 
     appointment.StatusID = 13; 
     db.Appointments.Add(appointment); 
+1

[参照の種類](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/reference-types)(おそらく[値の種類](https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/value-types)も参照してください)。 'appointment'は' currentAppointment'によって表される同じオブジェクトへのポインタに過ぎないので、あなたはエラーを受け取ります。 'db'とは何ですか?それはエンティティフレームワークなのでしょうか? – Equalsk

+0

Entity Framework –

+0

おそらく、これを達成するために 'AsNoTracking'を使用することを検討できます。 https://stackoverflow.com/questions/15308747/entity-framework-5-deep-copy-clone-of-anentity –

答えて

0

このエラーは、あなたのAppIDが主キーであると思います。したがって、これが主キーであれば、Guid.NewGuid();すでにデータベースに存在する値を返すことができます。したがって、そのキーを持つ予定が存在する場合は変数とvalidadeに保存できます。存在しない場合は追加し、別の場合は生成します。

1

私のコメントに記載されているように、Reference Typesと約Value Typesを読んで、なぜこのエラーが発生するのかを理解する必要があります。

短いと、Appointment appointment = currentAppointment;と言うと、appointmentからcurrentAppointmentを表す同じオブジェクトにリンクを作成するようなものです。いずれかのプロパティを変更すると、そのプロパティは別のプロパティで変更されます。

Entity Frameworkのは、このような別の上に1つのクラスをマッピングする方法があります。

// Get current Appointment 
var currentAppointment = db.Appointments.Find(id); 

// Make a brand new Appointment 
var appointment = new Appointment(); 

// Map one to the other 
db.Entry(currentAppointment).CurrentValues.SetValues(appointment); 

// Change the ID 
appointment.AppID = Guid.NewGuid(); 

// Add to database 
db.Appointments.Add(appointment); 

// Whatever else happens 

// Save 
db.SaveChanges(); 

予定のGUIDが既に存在することができるとチャンスがありますようあなたが衝突を避けるために、いくつかの仕事をしたいことがあります。

個人的には、AppIdのデータベース列をGUID自体を生成するidentifierとして設定することをおすすめします。その後、C#のオブジェクトにはnullというIDが追加されます。残りはデータベースレベルで処理されます。

関連する問題