2013-01-14 37 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