2013-04-17 82 views
5

在一個視圖模型填充數據我有兩個模型的人,地址需要數據的視圖模型:MVC4 C#從數據庫

型號:

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

視圖模型是這樣

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); 
} 
+0

什麼是'在這種情況下db'?這個例外的信息是什麼?你在使用Entity Framework還是LinqToSql?無論'db'似乎都在執行命令來檢索數據時遇到問題,但沒有更多的信息,它可能是任何東西。 –

+0

@Brian S我正在使用實體框架。數據庫是上下文。 – Xaxum

+1

你爲什麼不使用導航屬性? – lahsrah

回答

5

首先,EntityCommandExecutionException錯誤指示n實體上下文定義中的錯誤,或實體本身。這是拋出一個異常,因爲它發現數據庫與你告訴它應該是不同的。你需要弄清楚這個問題。

其次,關於正確的方法來做到這一點,你已經顯示的代碼應該工作,如果你的上下文被正確配置。但是,更好的方法是使用Navigational屬性,只要您想獲取所有相關記錄並且不指定其他Where子句參數。導航屬性可能是這樣的:

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()'將只給出集合中的第一個地址 - 即使它們全部都在集合中。但是由於OP的代碼有'.SingleOrDefault()',我想這已經佔了。 '。FirstOrDefault()'也比'.SingleOrDefault()'更好,因爲當你知道你只會得到一個響應時,「single」更適合。 – vapcguy

+0

對不起,還有一點需要注意:爲了讓這個工作適合我,我必須在db.Persons的末尾添加'.Include(「Addresses」)'在集合填入之前。我編輯了文章以包含一個對此進行評論並糾正許多語法錯誤。 – vapcguy

2

對於顯示對象的列表,你可以使用具有泛型列表通用視圖模型:

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

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

有一個返回控制器動作,說所有的人從你的數據庫:

[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); 
} 

然後使您的視圖強類型,採用您的通用視圖模型:

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

感謝您的迴應。我不確定這將如何從地址模型數據中獲取數據?我可以在沒有問題的情況下獲得人員或地址,這只是當我嘗試使用視圖模型將它們組合成問題的一個模型時。 – Xaxum

+0

您應該在Person和Address之間建立關係,這取決於您的應用程序的範圍,但爲了簡單起見,假設它是1:1,即一個Person有一個Address。然後,您可以在視圖中訪問像person.Address.City等人的地址。以下是Code First協會的鏈接http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one- foreign-key-associations.aspx – MattSull

+0

這是@sylon上面提到的導航屬性?我有一對多的關係,一個人可以有很多地址。外鍵是由實體框架建立的,但也許沒有虛擬的我不能引用像person.Adddress.City。 – Xaxum