2013-01-14 79 views
0

我正在考慮用MVC4開發一個Web /移動應用程序。對於我所瞭解的ASP.NET MVC,當您在表和模型類之間存在1對1關係時,它非常有用,而當您需要使用規範化數據庫時遇到了一些問題。ASP.NET MVC 4數據庫規範化

--- UPDATE ---

即使在過去,我用LINQ到SQL,我想用實體數據模型(目前還不能確定,但​​乍一看似乎更好)。

-

愚蠢的例子:

**table person** 
ID 
Name 
Surname 
HairColorID 

**table hairColor** 
HairColorID 
Color 

我想知道,如果這樣的情況在MVC4容易解決,沒有太多的代碼,以手動映射所有的表寫。我的意思是,我不知道是否有一些簡單的方法,可以讓我的控制器是這樣的:

public ActionResult About(Person person) 

那裏的人自動加入我的兩個表。

+3

這與MVC沒什麼關係,並且更多地與你的對象映射策略有關。你用什麼來訪問數據庫。 –

+0

你說得對。更新後,無論如何,我正在考慮使用ADO.NET實體數據模型。 – Davide

回答

1

我使用不同的項目將我的應用程序分成幾個不同的層。

  • 我的AppName.Data項目處理我所有的數據訪問(即從數據庫檢索數據)。
  • 我的AppName.Models項目包含所有的視圖模型類和 其他模型類,我需要爲我的應用程序。
  • 我的AppName.Web項目簡直就是MVC web應用程序
  • 我的AppName.Services項目處理我所有的業務邏輯以及Web層和數據層之間的通信。它構建視圖模型,處理數據驗證等。我從來不用實際的數據庫對象調用控制器操作方法。我總是使用視圖模型。該視圖模型只包含我需要填充我的視圖。

所以,在這種情況下,我會做什麼,如果這是一個只讀視圖是創建一個類似如下的AboutPersonDisplayViewModel:

public class AboutPersonDisplayViewModel 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public string HairColor { get; set; } 
} 

如果它是一個可編輯的觀點,我將有一個單獨的視圖模型是這樣的:

public class AboutPersonEditViewModel 
{ 
    public int PersonID { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public int HairColorID { get; set; } 
    public IDictionary<int, string> HairColorOptions { get; set; } 
} 

在數據庫中,你應該有一個人和hairColor表之間的關係。因此,在構建視圖模型時,可以簡單地獲取要查找的ID的人員,並使用該人員的信息填充AboutPersonViewModel,然後使用導航屬性導航到Person.HairColor以獲取存儲ID的頭髮顏色。

然後,當我保存時,服務層將驗證數據並正確地映射/保存所選的頭髮顏色。

我希望這有助於

+1

感謝您的回答,這基本上是我在過去的項目中所做的,是的,它工作得很好。我的問題實際上是解決方案非常耗時,我需要爲我想開發的廉價項目找到最佳解決方案。如果這是最快的解決方案,我會繼續,但我很懶,我希望更快的事情可以做:) – Davide

+0

+1爲懶惰! :) –

1

專門查看您的數據訪問。看起來你想要一個複雜的person類,它是由數據庫中的許多表構成的,並且你想快速構建你的對象,而不用分離你的關注。

您可以使用Dapper輕鬆映射對象。

這裏是一個非常簡單的例子:

using System; 
using System.Collections.Generic; 
using System.Data.SqlClient; 
using Dapper; 
namespace DapperTest 
{ 
    class MyEntity 
    { 
     public int ID { get; set; } 
     public string name { get; set; } 
     public string Description { get; set; } 
    } 

    class Program 
    { 

     public static readonly string connectionString = "Data Source=.;Initial Catalog=sandbox;Integrated Security=True"; 

     public static SqlConnection GetOpenConnection() 
     { 
      var connection = new SqlConnection(connectionString); 
      connection.Open(); 
      return connection; 
     } 

     static void Main(string[] args) 
     { 
      var c = GetOpenConnection(); 
      IEnumerable<MyEntity> result = c.Query<MyEntity>(@"select people.id, people.description as name ,beauty.description from people 
join peoplebeautylink on peopleid = people.id 
join beauty on beautyid = beauty.id "); 
      foreach (var myEntity in result) 
      { 
       Console.WriteLine(myEntity.name); 
      } 
      Console.ReadKey(); 
     } 
    } 
} 

如果您正在尋找剝離MVC的儀式了。我建議你看看Nancy