0

我有以下操作方法:-

 [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);

但是,如果引发 DbUpdateConcurrncy 异常,我将在 databaseValues.DataCenter.Name&上获得 Null 引用异常databaseValues.Zone.Name。看来我无法从 . 访问两个导航属性(数据中心和机架)Getdatabase().Toobject。知道如何解决这个问题吗?

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].Local.Find(idOfReferencedElement);
}
于 2015-04-22T15:58:30.763 回答