1

私は次のアクションメソッドを持っています:-

  [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit(Rack rack)
            {
                try
                {
                    if (ModelState.IsValid)
                    {
                        repository.InsertOrUpdateRack(rack);
                        repository.Save();
                        return RedirectToAction("Index");
                    }

                }
                catch (DbUpdateConcurrencyException ex)
                {
                    var entry = ex.Entries.Single();
                    var databaseValues = (Rack)entry.GetDatabaseValues().ToObject();
                    var clientValues = (Rack)entry.Entity;


                    if (databaseValues.RU != clientValues.RU)
                        ModelState.AddModelError("RU", "Current value: "
                            + databaseValues.RU);
                    if (databaseValues.DataCenterID != clientValues.DataCenterID)
                        ModelState.AddModelError("DataCenterID", "Current value: "
                            + databaseValues.DataCenter.Name);
                    if (databaseValues.ZoneID != clientValues.ZoneID)
                        ModelState.AddModelError("ZoneID", "Current value: "
                            + databaseValues.Zone.Name);

しかし、DbUpdateConcurrency 例外が発生すると、Null 参照例外が発生しdatabaseValues.DataCenter.Name & databaseValues.Zone.Nameます。から 2 つのナビゲーション プロパティ (データ センターとラック) にアクセスできないようですGetdatabase().Toobject

この問題を解決する方法はありますか? 2 つのナビゲーション値がデータベース内に既に値を持っていることに注意してください。

4

1 に答える 1

0

同時実行性の問題などを処理しようとしているときにまだこれに出くわす人のために、ここを離れます。

このToObjectメソッドは現在、エンティティに最新のデータベース値を設定するときに、データベースからエンティティのナビゲーション プロパティを設定しません。ナビゲーション プロパティには手動で処理する必要がある追加/削除がある可能性があるため、これは何とか受け入れられます。エンティティが分離されていることにも注意してください

EF によってこれらの値を自動的に入力する方法を実際に見つけることができませんでした。おそらく、関心のある各プロパティに対して 'GetValue` メソッドを使用してから、それらを自分で設定する必要があります。

これは、ソリューションのような疑似コードです。

DbEntityEntry entry = context.Entry(yourEntity);
//Gets latest values of entity from the database
var propertyValues = entry.GetDatabaseValues();
//Fills an entity object with database values(except navigational properties)
dynamic newEntity = propertyValues.ToObject();
//Manually loading the needed navigational properties and handling add/removes.
foreach (var prop in propertyValues.PropertyNames)
{
    //either a collection<int> or an int.
    var idOfReferencedElement = propertyValues.GetValue<int>(foreignKeyField);
    //remember to handle add/removes too.
    newEntity.[thePropertyYouKnowExist] = context.[theDBSet].Find(idOfReferencedElement);
}
于 2015-04-22T15:57:09.583 に答える