2013-04-17 7 views
5

से एक viewmodel में डेटा से पॉप्युलेट करना मैं एक viewmodel जो दो मॉडल व्यक्ति और पते से डेटा की जरूरत है:MVC4 सी # डेटाबेस

मॉडल:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public int Gender { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Street { get; set; } 
    public int Zip { get; set; } 
    public int PersonId {get; set; } 
} 

ViewModel ऐसे

public class PersonAddViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Street { get; set; } 
} 
के रूप में है

मैंने व्यूमोडेल में डेटा प्राप्त करने और इसे देखने के लिए कई तरीकों का प्रयास किया है। प्रदर्शित करने के लिए कई रिकॉर्ड लौटाए जाएंगे।

मेरे नवीनतम विधि जैसे दृश्य मॉडल को आबाद करने जाता है:

private AppContexts db = new AppContexts(); 
public ActionResult ListPeople() 
{ 
    var model = new PersonAddViewModel(); 
    var people = db.Persons; 
    foreach(Person p in people) 
    { 
     Address address = db.Addresses.SingleOrDefault(a => a.PersonId == p.Id) 
     model.Id = p.Id; 
     model.Name = p.Name; 
     model.Street = address.Street; 
    } 
    return View(model.ToList()); 
} 

मैं पता पता = db पर एक त्रुटि प्राप्त ... "EntityCommandExecutionException की लाइन उपयोगकर्ता कोड से बिना क्रिया था

कैसे। आप एक से अधिक रिकॉर्ड के साथ एक दृश्य के मॉडल को पॉप्युलेट और एक दृश्य के लिए पारित कर सकते हैं

अंतिम समाधान:

private AppContexts db = new AppContexts(); 
private AppContexts dbt = new AppContexts(); 
public ActionResult ListPeople() 
{ 
    List<PersonAddViewModel> list = new List<PersonAddViewModel>(); 
    var people = db.Persons; 
    foreach(Person p in people) 
    { 
     PersonAddViewModel model = new PersonAddViewModel(); 
     Address address = dbt.Addresses.SingleOrDefault(a => a.PersonId == p.Id) 
     model.Id = p.Id; 
     model.Name = p.Name; 
     model.Street = address.Street; 
    } 
    return View(list); 
} 
,210
+0

क्या 'इस मामले में db' है? और अपवाद का संदेश क्या है? क्या आप एंटिटी फ्रेमवर्क या लिंककॉस्कल का उपयोग कर रहे हैं? जो भी 'db' डेटा को पुनर्प्राप्त करने के लिए कमांड को निष्पादित करने में परेशानी हो रही है, लेकिन अधिक जानकारी के बिना, यह कुछ भी हो सकता है। –

+0

@ ब्रायन एस मैं इकाई ढांचे का उपयोग कर रहा हूँ। डीबी संदर्भ है। – Xaxum

+1

आप नेविगेशन गुणों का उपयोग क्यों नहीं कर रहे हैं? – lahsrah

उत्तर

5

पहले, EntityCommandExecutionException त्रुटियों एक इंगित करता है आपकी इकाई संदर्भ, या संस्थाओं की परिभाषा में n त्रुटि। यह एक अपवाद फेंक रहा है क्योंकि यह डेटाबेस को जिस तरह से बताया गया है उससे अलग होना पाया गया है। आपको उस समस्या को समझने की जरूरत है।

दूसरा, ऐसा करने के उचित तरीके के संबंध में, आपके द्वारा दिखाए गए कोड को काम करना चाहिए यदि आपका संदर्भ सही तरीके से कॉन्फ़िगर किया गया हो। लेकिन, नेविगेशन गुणों का उपयोग करने का एक बेहतर तरीका होगा, जब तक कि आप सभी संबंधित रिकॉर्ड प्राप्त नहीं करना चाहते हैं और अन्य निर्दिष्ट नहीं करते हैं जहां खंड पैरामीटर। एक नौवहन संपत्ति इस प्रकार दिखाई देंगे:

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public int Gender { get; set; } 

    public virtual Address Address { get; set; } 
    // or possibly, if you want more than one address per person 
    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Street { get; set; } 
    public int Zip { get; set; } 
    public int PersonId { get; set; } 

    public virtual Person Person { get; set; } 
} 

तो फिर तुम बस यही कहूंगा:

public ActionResult ListPeople() 
{ 
    var model = (from p in db.Persons // .Includes("Addresses") here? 
       select new PersonAddViewModel() { 
        Id = p.Id, 
        Name = p.Name, 
        Street = p.Address.Street, 
        // or if collection 
        Street2 = p.Addresses.Select(a => a.Street).FirstOrDefault() 
       }); 

    return View(model.ToList()); 
} 
+0

नोट: यदि संग्रह का उपयोग करने के लिए इसे सेट अप किया गया है, तो '.FirstOrDefault()' का उपयोग करके आप संग्रह में केवल पहला पता देंगे - भले ही वे सभी संग्रह में हों। लेकिन चूंकि ओपी के कोड में '.SingleOrDefault()' था, मुझे लगता है कि यह पहले से ही जिम्मेदार था। 'FirstOrDefault() '' SingleOrDefault() 'से भी बेहतर है, क्योंकि जब आप जानते हैं कि" सिंगल "अधिक है तो आपको केवल एक प्रतिक्रिया मिलेगी। – vapcguy

+0

क्षमा करें एक और नोट: इसे मेरे लिए काम करने के लिए, मुझे संग्रह भरने से पहले 'डीबी.पर्सन' के अंत में 'शामिल करें (" पता ") 'जोड़ना था। मैंने पोस्ट को संपादित करने के लिए संपादित किया इस पर टिप्पणी करें और कई वाक्यविन्यास त्रुटियों में सुधार। – vapcguy

2

वस्तुओं की सूची प्रदर्शित करने के लिए, आप एक सामान्य सूची है कि एक सामान्य दृश्य मॉडल इस्तेमाल कर सकते हैं:

[HttpGet] 
public ActionResult GetAllPeople(GenericViewModel<People> viewModel) 
{ 
    var query = (from x in db.People select x); // Select all people 
    viewModel.Results = query.ToList(); 

    return View("_MyView", viewModel); 
} 

:

public class GenericViewModel<T> 
{ 
    public List<T> Results { get; set; } 

    public GenericViewModel() 
    { 
     this.Results = new List<T>(); 
    } 
} 

एक नियंत्रक कार्रवाई है कि रिटर्न रखते हैं, का कहना है कि अपने डेटाबेस से सभी लोगों को तब आपके विचार दृढ़ता से लिखा है, अपने सामान्य दृश्य मॉडल में ले रही है:

@model NameSpace.ViewModels.GenericViewModel<NameSpace.Models.People> 
+0

प्रतिक्रिया के लिए धन्यवाद। मुझे यकीन नहीं है कि यह पता मॉडल डेटा से डेटा कैसे प्राप्त करेगा? मैं बिना किसी मुद्दे के लोगों या पते को प्राप्त कर सकता हूं, जब मैं एक मॉडल मॉडल को एक मॉडल में गठबंधन करने के लिए व्यूमोडेल का उपयोग करने का प्रयास करता हूं। – Xaxum

+0

आपको व्यक्ति और पता के बीच संबंध बनाना चाहिए, यह आपके ऐप के दायरे पर निर्भर करेगा, लेकिन सादगी के लिए मान लें कि यह 1: 1 है यानी एक व्यक्ति का एक पता है। फिर आप अपने विचार में किसी व्यक्ति के पते को एक्सेस करने में सक्षम होंगे। एड्रेस.सिटी इत्यादि। यहां कोड फर्स्ट एसोसिएशन पर एक लिंक दिया गया है http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one- विदेशी-कुंजी-एसोसिएशन.aspx – MattSull

+0

क्या यह @ साइलन उपरोक्त गुणों के रूप में उपरोक्त उल्लेख कर रहा था? मेरे पास कई रिश्ते हैं, एक व्यक्ति के पास कई पते हो सकते हैं। विदेशी कुंजी इकाई ढांचे द्वारा स्थापित की गई थीं लेकिन शायद आभासी के बिना मैं व्यक्ति की तरह संदर्भ नहीं दे सकता। Adddress.City। – Xaxum