asp.net-mvc – 强大类型的ASP.NET MVC与ADO.NET实体框架

前端之家收集整理的这篇文章主要介绍了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

我的人/编辑视图的一部分:

  1. <% using (Html.BeginForm()) {%>
  2. <%= Html.Hidden("Id",Model.Id) %>
  3. <fieldset>
  4. <legend>Fields</legend>
  5. <p>
  6. <label for="Name">Name:</label>
  7. <%= Html.TextBox("Name",Model.Name) %>
  8. </p>
  9. <p>
  10. <label for="DepartmentId">Department:</label>
  11. <%= Html.DropDownList("DepartmentId",new SelectList((IEnumerable)ViewData["Departments"],"Id","Name"))%>
  12. </p>
  13. <p>
  14. <input type="submit" value="Save" />
  15. </p>
  16. </fieldset>
  17. <% } %>

我的人员控制器的一部分:

  1. //
  2. // GET: /Person/Edit/5
  3.  
  4. public ActionResult Edit(Guid id)
  5. {
  6. ViewData["Departments"] = ctx.Department;
  7. Person model = (from Person p in ctx.Person
  8. where p.Id == id
  9. select p).FirstOrDefault();
  10. return View(model);
  11. }
  12.  
  13. //
  14. // POST: /Person/Edit
  15.  
  16. [AcceptVerbs(HttpVerbs.Post)]
  17. public ActionResult Edit(Person model)
  18. {
  19. ctx.AttachUpdated(model); //extension
  20. ctx.SaveChanges();
  21. return RedirectToAction("Index");
  22. }

为了得到这个工作,我用一个新的DepartmentId属性扩展了Person EntityObject.

  1. using System;
  2. using System.Data;
  3. using System.Data.Objects.DataClasses;
  4.  
  5. namespace ProjectName.Models
  6. {
  7. public partial class Person : EntityObject
  8. {
  9. public Guid DepartmentId
  10. {
  11. get
  12. {
  13. try
  14. {
  15. return (Guid)this.DepartmentReference.EntityKey.EntityKeyValues[0].Value;
  16. }
  17. catch
  18. {
  19. return Guid.Empty;
  20. }
  21. }
  22. set
  23. {
  24. this.DepartmentReference.EntityKey = new EntityKey("JunkEntities.Department",value);
  25. }
  26. }
  27. }
  28. }

并且我用新的AttachUpdated和ApplyReferencePropertyChanges方法扩展了Entity Framework ObjectContext:

  1. using System;
  2. using System.Data;
  3. using System.Data.Objects;
  4. using System.Data.Objects.DataClasses;
  5.  
  6. public static class EntityFrameworkExtensionMethods
  7. {
  8.  
  9. public static void AttachUpdated(this ObjectContext ctx,EntityObject objectDetached)
  10. {
  11. if (objectDetached.EntityKey == null)
  12. {
  13. String entitySetName = ctx.DefaultContainerName + "." + objectDetached.GetType().Name;
  14. Guid objectId = (Guid)objectDetached.GetType().GetProperty("Id").GetValue(objectDetached,null);
  15. objectDetached.EntityKey = new System.Data.EntityKey(entitySetName,objectId);
  16. }
  17. if (objectDetached.EntityState == EntityState.Detached)
  18. {
  19. object currentEntityInDb = null;
  20. if (ctx.TryGetObjectByKey(objectDetached.EntityKey,out currentEntityInDb))
  21. {
  22. ctx.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName,objectDetached);
  23. ctx.ApplyReferencePropertyChanges((IEntityWithRelationships)objectDetached,(IEntityWithRelationships)currentEntityInDb); //extension
  24. }
  25. else
  26. {
  27. throw new ObjectNotFoundException();
  28. }
  29. }
  30. }
  31.  
  32. public static void ApplyReferencePropertyChanges(this ObjectContext ctx,IEntityWithRelationships newEntity,IEntityWithRelationships oldEntity)
  33. {
  34. foreach (var relatedEnd in oldEntity.RelationshipManager.GetAllRelatedEnds())
  35. {
  36. var oldRef = relatedEnd as EntityReference;
  37. if (oldRef != null)
  38. {
  39. var newRef = newEntity.RelationshipManager.GetRelatedEnd(oldRef.RelationshipName,oldRef.TargetRoleName) as EntityReference;
  40. oldRef.EntityKey = newRef.EntityKey;
  41. }
  42. }
  43. }
  44.  
  45. }

我只想记录我在这里的进度.请建议改进​​.

谢谢:

> Alex James
> Cesar de la Torre
> Griff Townsend
> Steve Willcock
> jrista
> Tomas Lycken
> Thomas Levesque
> Danny Simmons
> Stefan Cruysberghs

解决方法

我已经开始使用ASP.NET MVC,这就是为什么我来到这个线程,所以我不知道你是否仍在检查改进.

我不喜欢将这个新属性添加到实体框架上的部分类中,因为它不允许有太多变化.
尝试标记你的Deparment DropDown“Department.Id”这样

  1. <p>
  2. <label for="Department.Id">Department:</label>
  3. <%= Html.DropDownList("Department.Id","Name"))%>
  4. </p>

MVC框架的ModelBinding将获取该值并将其应用于“部门”导航属性的“Id”属性.我发现部门的其他价值是空的,但这并不重要.现在,您有一种方法来检索正确的部门实体并将其应用于在“绑定到您的Action”参数中创建的新Person实体的部门导航属性,如下所示:

  1. newPerson.Department = ctx.Department.First(d => d.DepartmentId == newPerson.Department.Id);

这样做,您不需要更新您的实体,因为它应该具有的属性.

猜你在找的asp.Net相关文章