2016-08-19 128 views
0

我想實現一個沒有實體框架的MVC應用程序,而是使用數據表來填充我的業務對象,但我有很多問題。沒有實體框架的MVC模式

假設我有這個簡單的clasess:

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

public class Phone { 
    public int Id { get; set; } 
    public string PhoneNumber { get; set; } 
    public int PersonId { get; set; } 
} 

如果我使用EF,Person類必須有一個導航屬性來獲取手機及手機類必須有一個導航屬性的人。所以,如果我要顯示與電話的人名單,SQL結果應該是這樣的:

------------------------------------------------------------ 
| **PersonId** |**Name** | **PhoneId** | **PhoneNumber** | 
------------------------------------------------------------ 
|    1 | John Doe |   1 | 111-55-5855  | 
------------------------------------------------------------ 
|    1 | John Doe |   2 | 111-55-5521  | 
------------------------------------------------------------ 
|    2 | Mary Jane|   3 | 254-565-855  | 
------------------------------------------------------------ 
|    3 | J. Watson|   NULL|    NULL| 
------------------------------------------------------------ 

到目前爲止,我所做的是這樣的:

在我看來,我必須表明接觸用這種格式:

------------------------------------------------------------ 
|**Name** | ** Phones **        | 
------------------------------------------------------------ 
| John Doe | 111-55-5855, 111-55-5521     | 
------------------------------------------------------------ 
| Mary Jane| 254-565-855         | 
------------------------------------------------------------ 
| J. Watson| -           | 
------------------------------------------------------------ 

我創建了第三個類,我不知道它的必要性。在這個類中,我存儲了由我的sql查詢返回的結果。這個結果與上面的第一個表格完全相同,這與EF將返回的結果相同。

public class PersonForList { 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
    public int PhoneId { get; set; } 
    public string PhoneNumber { get; set; } 
} 

我有這種方法的PersonManager:

public List<PersonForList> GetPeopleWithPhones { 
    List<PersonForList> people = new List<PersonForList>(); 
    SqlCommand command = new Command(query); 
    var dt = ExecuteDataTable(command); 

    foreach(DataRow row in dt.Rows){ 
     var person = new PersonForList() { 
      ... Fill object 
      PersonId = (int)row["PersonId"], 
      ... 
     } 
     people.Add(person); 
    } 
    return people; 
} 

而在去年,我的視圖模型:

public class PersonListViewModel { 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
    public string Phones { get; set; } 
} 

(如果你真的走到這一步,你必須是一個真正的病人= S)

問題:

如果我必須對列表進行分頁,我如何計算不同的記錄,但仍然在查詢中包含所有電話?例如,如果頁面大小爲3,使用我當前的查詢,我將只檢索John Doe和Mary Jane Phones,因爲這是3行,但不適合不同的人。

如何填充我的視圖模型?我不知道如何遍歷列表來獲得一個人的所有電話。

我的類PersonForList真的有必要嗎?

不知何故,這是實體框架的行爲,我只是試圖模仿以最少數量的查詢來獲取數據。

我試圖做到非常具體,並保持簡短的問題,但如果您需要更多的細節,我可以提供給您。

+0

最好在多個帖子中提問你的問題。首先,你爲什麼不想使用EF?對於分頁數據,它取決於您使用的SQL Server版本,例如,您可以在SQL 2014中使用OFFSET,在另一版本中使用Row_number。 –

+0

在我的書中,PersonForList是沒有必要的。我認爲你可以用EF來更好地完成你的查詢。 –

+0

在我的工作中,我們使用自己的ORM,但實際上不支持連接,所以,當需要連接時,我們需要進行原始查詢,然後手動映射結果。我正在使用SQL Server 2014. –

回答

0

對於從一個對象到另一個對象的映射數據,我會使用AutoMapper,其他工具可用。

但我同意大家,使用ORM它會讓你的生活更快樂32%。