के साथ मजबूत रूप से टाइप किए गए एएसपी.नेट एमवीसी संघर्ष के दिनों के बाद मुझे यह काम मिल गया है।एडीओ.NET इकाई फ्रेमवर्क
मैं लोगों को और विभागों का एक सरल डेटाबेस मिल गया है:
मैं संदर्भ/नेविगेशन गुण के लिए दृढ़ता से टाइप ASP.NET MVC दृश्यों का उपयोग कर सकते हैं! ,
//
// 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");
}
इस कार्य करवाने के लिए: विभागों की सूची देखें ... मेरे विचार व्यक्ति/संपादित की
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>
<% } %>
मेरी व्यक्ति नियंत्रक का हिस्सा मैंने एक नई विभाग आईडी संपत्ति के साथ व्यक्ति 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", "Id", value);
}
}
}
}
और मैं नई AttachUpdated और ApplyReferencePropertyChanges तरीकों के साथ इकाई की रूपरेखा 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, "Id", 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
- Cesar de la Torre
- Griff Townsend
- Steve Willcock
- jrista
- Tomas Lycken
- Thomas Levesque
- Danny Simmons
- Stefan Cruysberghs
अच्छी नौकरी, लेकिन दुर्भाग्य से stackoverflow.com आपके लिए अपनी प्रगति को दस्तावेज करने के लिए जगह नहीं है। मैंने करीब मतदान किया: "असली सवाल नहीं"। –
क्या व्यक्ति वस्तु को बाध्य करते समय आपको आईडी प्रॉपर्टी को बाहर करने की आवश्यकता नहीं है: सार्वजनिक कार्यवाही संपादन (GUID आईडी, व्यक्ति मॉडल)? –
आह, मुझे "सुधार सुधार" के बारे में हिस्सा याद आया। मैं रहने दो, मैं कहता हूँ। –