0

発行者は、関連フィールドとして KeyEntity を持っています。私のコードは機能しますが、データベースからエンティティをロードする以外に、関連するフィールドを更新するより良い方法が必要だと思います。ViewModeling とテンプレートに何か問題があるはずです...よろしくお願いします。

OpViewModel

public class OpViewModel
{   
    public Connect.Models.Issuer Issuer { get; set; }
    public IEnumerable<SelectListItem> KeyEntities { get; set; }

    public OpViewModel() { } 
    public OpViewModel(Connect.Models.Issuer issuer, 
                        IEnumerable<Jose.Models.KeyEntity> key_entities)
    {   
        this.Issuer = issuer;
        this.KeyEntities = key_entities.Select(k =>
                        new SelectListItem()
                        {   
                            Selected = (k.Id == issuer.KeyEntity.Id),
                            Text = k.Id.ToString(),
                            Value = k.Id.ToString()
                        }); 
    }   
}   

Op/Edit.chtml(カミソリ)

@model AdConnect.Models.OpViewModel
@using (Html.BeginForm()) {

    <div class="editor-field">
        @Html.DropDownListFor(model => model.Issuer.KeyEntity.Id,
                                Model.KeyEntities)
    </div>

}   

OpController

    [HttpPost]
    public ActionResult Edit(Models.OpViewModel obj)
    {   
        if (ModelState.IsValid)
        { 
            //  This works for most data fields of Issuer, but KeyEntity's Id 
            //  (dbo.Issuers.KeyEntity_Id) is not updated.
            //
            //  ctx.Entry(obj.Issuer).State = System.Data.EntityState.Modified

            //  So load Issuer and KeyEntity from the database and update.

            var issuer = ctx.Issuers.Find(obj.Issuer.Id);
            if (obj.Issuer.KeyEntity != null)
            {   
                 issuer.KeyEntity =
                    ctx.KeyEntities.Find(obj.Issuer.KeyEntity.Id);
            }   
            ctx.Entry(issuer).CurrentValues.SetValues(obj.Issuer);

            ctx.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(obj);
    }
4

1 に答える 1

0

ナビゲーションプロパティがどのように機能するかについて少し見落としていると思います。EFはそれらを自動的に設定できるため、オブジェクトのコンストラクターでそれを実行する必要はありません。

ここでnavプロパティに関する私の記事を読んでください。

また、コントローラーの更新コードに関しては、次のような更新の通常のパスは次のとおりです。ロード、変更、保存。

すなわち

var issuer = ctx.Issuers.Include(i=>i.KeyEntity).SingleOrDefault(i=>i.Id == obj.Issuer.Id);
issuer.Whatever = obj.Issuer.Whatever; //note prehaps you want something like CopyMatchinProperties here
ctx.SaveChanges();
于 2012-09-21T06:24:23.543 に答える