ビューでEFクラスを使用しないようにアドバイスします。最善の策は、ViewModelクラスを作成し、Automapperを使用してEFクラスからそれらをマップすることです。
ただし、データベースのレコードを更新する場合は、ViewModelのどのフィールドを使用してEFクラスの既存のフィールドを更新するかを制御できます。
通常のプロセスは次のとおりです。
Idを使用して、データベースから既存のオブジェクトの最新バージョンを取得します。
楽観的同時実行制御を使用している場合は、ViewModelが作成されてからオブジェクトが更新されていないことを確認してください(たとえば、タイムスタンプを確認してください)。
このオブジェクトを、ViewModelオブジェクトの必須フィールドで更新します。
更新されたオブジェクトをデータベースに永続化します。
Automapperの例を含めるように更新します。
あなたのPOCOが
public class MyObject
{
public int Id {get;set;}
public string Field1 {get;set;}
public string Field2 {get;set;}
}
Field1は、更新したくないフィールドです。
同じプロパティでビューモデルを宣言する必要があります。
public class MyObjectModel
{
public int Id {get;set;}
public string Field1 {get;set;}
public string Field2 {get;set;}
}
コントローラのコンストラクタでそれらの間を自動マップします。
Mapper.CreateMap<MyObject, MyObjectModel>();
必要に応じてできます(これは手動で行うことをお勧めしますが、他の方法でも自動マッピングします。
Mapper.CreateMap<MyObjectModel, MyObject>().ForMember(dest=>dest.Field1, opt=>opt.Ignore());
あなたがあなたのウェブサイトに日付を送るとき、あなたは使うでしょう:
var myObjectModelInstance = Mapper.Map<MyObject, MyObjectModel>(myObjectInstance);
viewModelを作成します。
データを保存するときは、おそらく次のようなものが必要になります。
public JsonResult SaveMyObject(MyObjectModel myModel)
{
var poco = Mapper.Map<MyObjectModel, MyObject>(myModel);
if(myModel.Id == 0 )
{
//New object
poco.Field1 = myModel.Field1 //set Field1 for new creates only
}
}
上記のField1の除外を削除して、次のようにします。
public JsonResult SaveMyObject(MyObjectModel myModel)
{
var poco;
if(myModel.Id == 0)
{
poco = Mapper.Map<MyObjectModel, MyObject>(myModel);
}
else
{
poco = myDataLayer.GetMyObjectById(myModel.Id);
poco.Field2 = myModel.Field2;
}
myDataLayer.SaveMyObject(poco);
}
ベストプラクティスでは、ViewModelから自動マップすることは決してないだろうと思いますが、新しいアイテムを含め、常に手動でこれを行う必要があります。