2009-05-28 13 views
13

के साथ मजबूत रूप से टाइप किए गए एएसपी.नेट एमवीसी संघर्ष के दिनों के बाद मुझे यह काम मिल गया है।एडीओ.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 दृश्यों का उपयोग कर सकते हैं! ,

// 
// 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; 
      } 
     } 
    } 

} 

मैं बस यहाँ मेरी प्रगति दस्तावेज़ के लिए करना चाहता था। कृपया सुधार का सुझाव दें।


धन्यवाद:

+3

अच्छी नौकरी, लेकिन दुर्भाग्य से stackoverflow.com आपके लिए अपनी प्रगति को दस्तावेज करने के लिए जगह नहीं है। मैंने करीब मतदान किया: "असली सवाल नहीं"। –

+1

क्या व्यक्ति वस्तु को बाध्य करते समय आपको आईडी प्रॉपर्टी को बाहर करने की आवश्यकता नहीं है: सार्वजनिक कार्यवाही संपादन (GUID आईडी, व्यक्ति मॉडल)? –

+3

आह, मुझे "सुधार सुधार" के बारे में हिस्सा याद आया। मैं रहने दो, मैं कहता हूँ। –

उत्तर

8

मैं एएसपी के साथ काम शुरू कर दिया है आपके विचार प्रमाणकों के लिए)

अद्यतन; मुझे यकीन है कि आप के बारे में थे हूँ .NET एमवीसी यही कारण है कि मैं इस धागे पर आया, इसलिए मुझे यकीन नहीं है कि आप अभी भी सुधार की जांच कर रहे हैं।

मुझे इकाई ढांचे पर आंशिक वर्ग में नई संपत्ति जोड़ने का विचार पसंद नहीं है क्योंकि यह ज्यादा परिवर्तन की अनुमति नहीं देता है। अपने डिपार्टमेंट ड्रॉपडाउन "विभाग को लेबल करने का प्रयास करें।ईद "की तरह इस

<p> 
    <label for="Department.Id">Department:</label> 
<%= Html.DropDownList("Department.Id", new SelectList((IEnumerable)ViewData["Departments"], "Id", "Name"))%> 
</p> 

MVC फ्रेमवर्क के ModelBinding मूल्य लेने और करने के लिए इसे लागू होगी" विभाग "नेविगेशन संपत्ति आईडी" की संपत्ति "। क्या मैंने पाया है कि विभाग के अन्य मूल्यों कर रहे हैं शून्य, लेकिन यह महत्वपूर्ण नहीं है। अब आपके पास सही विभाग इकाई को पुनर्प्राप्त करने और मॉडल एक्शन पैरामीटर में बनाए गए नए व्यक्ति इकाई की विभाग नेविगेशन संपत्ति को लागू करने का एक तरीका है:

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

ऐसा करने में, आपको अपनी संपत्ति को किसी संपत्ति के लिए अपडेट करने की आवश्यकता नहीं है।

+1

अच्छा और साफ! जैक, आप अपने नियंत्रकों पर EntityKey भी सेट कर सकते हैं विधि संपादित करें: newPerson.DepartmentReference.EntityKey = नई EntityKey ("YourEntities.Department", "DepartmentId", int.Parse (Request.Form ["DepartmentId"])); –

0

अपने संपादित करें ताकि नियंत्रित है कि यह अपवाद फेंक दिया जाता है संभालती है और इनपुट उपयोगकर्ता द्वारा अब तक में टाइप किया है redisplays सुधारें।

<label for="Name">Name:</label> 
<%= Html.TextBox("Name", Model.Name) %> 
<%= Html.ValidationMessage("Name", "*") %> 

और फिर उन्हें अपने संपादन में उपयोग:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Person Model) 
{ 
    try 
    { 
     ctx.AttachUpdated(Model); //extension 
     ctx.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     foreach (var err in Model.Errors) 
      ModelState.AddModelError(err.PropertyName, err.ErrorMessage) 

     return View(Model); 
    } 
} 
+0

"'.... व्यक्ति' में 'त्रुटियों' की परिभाषा नहीं है और किसी भी प्रकार की विधि 'त्रुटियों' को 'प्रकार' के पहले तर्क को स्वीकार नहीं किया जा सकता है .... व्यक्ति 'पाया जा सकता है (क्या आप एक निर्देश का उपयोग कर रहे हैं या एक असेंबली संदर्भ?) " –

+0

यह इस बात पर निर्भर करता है कि आप किस ढांचे का उपयोग कर रहे हैं। लाइटस्पीड और लिंक 2 एसक्यूएल आपको प्रत्येक इकाई पर त्रुटियों की संपत्ति देता है। यदि आप ओआरएम का उपयोग करने के बजाय मैन्युअल रूप से अपनी संस्थाएं बना रहे हैं, तो आपको उस संपत्ति को व्यक्ति के लिए अपनी आंशिक कक्षा में बनाना होगा। – womp

+0

इस आलेख में लिस्टिंग 3 और 4 की तरह कुछ: http://www.asp.net/Learn/mvc/tutorial-16-cs.aspx – womp

संबंधित मुद्दे