asp.net-mvc – 强大类型的ASP.NET MVC与ADO.NET实体框架
经过几天的斗争,我终于得到了这个工作.
我有一个简单的人员和部门数据库: ADO.NET Entity Framework Entity Data Model diagram with Department and Person objects http://img39.imageshack.us/img39/1368/edmxdepartmentperson.gif 我可以使用强类型的ASP.NET MVC视图参考/导航属性!查看部门清单… ASP.NET MVC with DropDownList http://img11.imageshack.us/img11/7619/dropdownlistdepartment.gif 我的人/编辑视图的一部分: <% using (Html.BeginForm()) {%> <%= Html.Hidden("Id",Model.Id) %> <fieldset> <legend>Fields</legend> <p> <label for="Name">Name:</label> <%= Html.TextBox("Name",Model.Name) %> </p> <p> <label for="DepartmentId">Department:</label> <%= Html.DropDownList("DepartmentId",new SelectList((IEnumerable)ViewData["Departments"],"Id","Name"))%> </p> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> 我的人员控制器的一部分: // // GET: /Person/Edit/5 public ActionResult Edit(Guid id) { ViewData["Departments"] = ctx.Department; Person model = (from Person p in ctx.Person where p.Id == id select p).FirstOrDefault(); return View(model); } // // POST: /Person/Edit [AcceptVerbs(HttpVerbs.Post)] public ActionResult Edit(Person model) { ctx.AttachUpdated(model); //extension ctx.SaveChanges(); return RedirectToAction("Index"); } 为了得到这个工作,我用一个新的DepartmentId属性扩展了Person EntityObject. using System; using System.Data; using System.Data.Objects.DataClasses; namespace ProjectName.Models { public partial class Person : EntityObject { public Guid DepartmentId { get { try { return (Guid)this.DepartmentReference.EntityKey.EntityKeyValues[0].Value; } catch { return Guid.Empty; } } set { this.DepartmentReference.EntityKey = new EntityKey("JunkEntities.Department",value); } } } } 并且我用新的AttachUpdated和ApplyReferencePropertyChanges方法扩展了Entity Framework ObjectContext: using System; using System.Data; using System.Data.Objects; using System.Data.Objects.DataClasses; public static class EntityFrameworkExtensionMethods { public static void AttachUpdated(this ObjectContext ctx,EntityObject objectDetached) { if (objectDetached.EntityKey == null) { String entitySetName = ctx.DefaultContainerName + "." + objectDetached.GetType().Name; Guid objectId = (Guid)objectDetached.GetType().GetProperty("Id").GetValue(objectDetached,null); objectDetached.EntityKey = new System.Data.EntityKey(entitySetName,objectId); } if (objectDetached.EntityState == EntityState.Detached) { object currentEntityInDb = null; if (ctx.TryGetObjectByKey(objectDetached.EntityKey,out currentEntityInDb)) { ctx.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName,objectDetached); ctx.ApplyReferencePropertyChanges((IEntityWithRelationships)objectDetached,(IEntityWithRelationships)currentEntityInDb); //extension } else { throw new ObjectNotFoundException(); } } } public static void ApplyReferencePropertyChanges(this ObjectContext ctx,IEntityWithRelationships newEntity,IEntityWithRelationships oldEntity) { foreach (var relatedEnd in oldEntity.RelationshipManager.GetAllRelatedEnds()) { var oldRef = relatedEnd as EntityReference; if (oldRef != null) { var newRef = newEntity.RelationshipManager.GetRelatedEnd(oldRef.RelationshipName,oldRef.TargetRoleName) as EntityReference; oldRef.EntityKey = newRef.EntityKey; } } } } 我只想记录我在这里的进度.请建议改进??. 谢谢: > Alex James 解决方法
我已经开始使用ASP.NET MVC,这就是为什么我来到这个线程,所以我不知道你是否仍在检查改进.
我不喜欢将这个新属性添加到实体框架上的部分类中,因为它不允许有太多变化. <p> <label for="Department.Id">Department:</label> <%= Html.DropDownList("Department.Id","Name"))%> </p> MVC框架的ModelBinding将获取该值并将其应用于“部门”导航属性的“Id”属性.我发现部门的其他价值是空的,但这并不重要.现在,您有一种方法来检索正确的部门实体并将其应用于在“绑定到您的Action”参数中创建的新Person实体的部门导航属性,如下所示: newPerson.Department = ctx.Department.First(d => d.DepartmentId == newPerson.Department.Id); 这样做,您不需要更新您的实体,因为它应该具有的属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- .net – 使用外部托管站点设置登台环境?
- asp.net – Team Build 2010和web.config转换的问题
- asp.net-mvc – 使用partialview时,HttpPostedFileBase始终
- .NET Framework 3.5中有哪些有用的新ASP.NET功能?
- ASP.NET MVC3 AJAX.BeginForm AjaxOptions OnSuccess OnFai
- ASP.Net核心 – 获取帖子表格的所有数据
- asp.net – 替代SSRS前端
- asp.net – ELMAH登录SQL Server
- asp.net – 将web.web应用程序池添加到web.config会导致500
- asp.net – 为什么会间歇地得到这个错误? “服务器未找到或
- [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的
- asp.net-mvc – ASP.NET MVC必需字段指示符
- ASP.NET 4.0中最好的浏览器检测解决方案
- asp.net-mvc – Url.Action生成查询字符串,以任何
- ASP.NET 4的IIS和服务器操作系统要求
- asp.net-mvc – MVC 4:强制ScriptBundle返回Jav
- asp.net – 多个域的集成Windows身份验证
- asp.net – 自定义协议MVC Redirect在Chrome中工
- asp.net-mvc – Automapper和Windsor的问题
- 通过LAN调试ASP.NET云项目