我需要设置一个EntityObject的EntityKey.我知道它的类型和它的id值.我不想不必要地查询数据库.
这有效......
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
Model.EntityKey = (from Department d in db.Department
where d.Id == id
select d).FirstOrDefault().EntityKey;
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
这失败了......
//
// POST: /Department/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Department Model)
{
String EntitySetName = db.DefaultContainerName + "." + Model.GetType().Name;
Model.EntityKey = new System.Data.EntityKey(EntitySetName, "Id", Model.Id);
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
该ApplyPropertyChanges()线路出现故障与此异常:
ObjectStateManager不包含ObjectStateEntry,其中引用了"Sample.Models.Department"类型的对象.
两个EntityKeys是平等的.为什么第二块代码失败?我该如何解决?
经过几天的学习EF了解(有点......)它是如何工作的,我终于意识到我可能有一个大问题.
想象一下,我有两个实体:Pais和UF.他们之间的关系是Pais (0..1) ... (*) UF.截图:http://i.imgur.com/rSOFU.jpg.
说,考虑到我有一个控制器被调用UFController,它有动作Edit和Create,这很好.我的视图使用EditorFor帮助器(或类似的)作为输入,因此当我提交表单时,控制器将接收一个UF填充了所有数据的对象(自动),并引用几乎为空的数据 Pais.我的视图代码(部分代码):
@* UF attributes *@
@Html.EditorFor(m => m.Sigla)
@Html.EditorFor(m => m.Descricao)
@Html.EditorFor(m => m.CodigoIBGE)
@Html.EditorFor(m => m.CodigoGIA)
@* Pais primary key ("ID") *@
@Html.EditorFor(m => m.Pais.Codigo) // Pais id
Run Code Online (Sandbox Code Playgroud)
控制器Edit动作代码:
[HttpPost]
public ActionResult Edit(UF uf)
{
try
{
if (ModelState.IsValid)
{
db.UFs.Attach(uf);
db.ObjectStateManager.ChangeObjectState(uf, EntityState.Modified);
db.SaveChanges();
return this.ClosePage(); // An …Run Code Online (Sandbox Code Playgroud) 此代码无法实际保存任何更改:
//
// POST: /SomeType/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, SomeType Model)
{
db.AttachTo(Model.GetType().Name, Model);
db.ApplyPropertyChanges(Model.EntityKey.EntitySetName, Model);
db.SaveChanges();
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
ASP.NET MVC将对象Model创建为Department类型EntityObject,其EntityState值为Detached.
使用AttachTo方法后,其EntityState变为Unchanged.
对象以Unchanged状态附加到对象上下文.
由于其Unchanged状态,ApplyPropertyChanges方法不执行任何操作.
我希望它具有状态修改.
已分离
对象存在但对象服务未对其进行跟踪.在创建实体并将其添加到对象上下文之前,实体立即处于此状态.通过调用Detach方法或使用NoTrackingMergeOption加载实体后,实体也处于此状态.未更改
对象未被修改,因为它已加载到上下文中或自上次调用SaveChanges方法以来.已修改
对象已更改,但尚未调用SaveChanges方法.
我无法将EntityObject的EntityState属性显式设置为Modified.它是只读的.
使用EntityObjects的强类型MVC控制器是不是不可能?