【问题标题】:ASP.NET MVC 4 database normalizationASP.NET MVC 4 数据库规范化
【发布时间】:2013-01-14 10:17:07
【问题描述】:

我正在考虑使用 MVC4 开发一个网络/移动应用程序。就我对 ASP.NET MVC 的了解而言,当您在表和模型类之间具有 1 对 1 的关系时,它非常有用,而当您需要使用规范化数据库时,我遇到了一些问题。

---更新---

即使过去我使用 Linq to SQL,我也在考虑使用实体数据模型(还不确定,但乍一看似乎更好)。

--

一个愚蠢的例子:

**table person**
ID
Name
Surname
HairColorID

**table hairColor**
HairColorID
Color

我想知道这样的情况是否可以在 MVC4 中轻松解决,而无需编写太多代码来手动映射所有表。我的意思是,我不知道在我的控制器中是否有一些简单的方法,例如:

public ActionResult About(Person person)

这里的人自动加入我的两张桌子。

【问题讨论】:

  • 这与 MVC 关系不大,更多的是与您的对象映射策略有关。你用什么来访问数据库。
  • 你是对的。更新了帖子,无论如何我正在考虑使用 ADO.NET 实体数据模型。

标签: asp.net-mvc asp.net-mvc-4 normalization


【解决方案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; }
}

在数据库中,您应该在 person 和 hairColor 表之间建立关系。因此,当您构建视图模型时,您只需获取要查找的 ID 的人员,并使用该人员的信息填充 AboutPersonViewModel 并使用导航属性导航到 Person.HairColor 以获取存储的 ID 的头发颜色.

然后,当我保存时,服务层将验证数据并正确映射/保存选择的头发颜色。

希望对你有帮助

【讨论】:

  • 感谢您的回答,这基本上是我在过去的项目中所做的,是的,效果很好。我的问题实际上是该解决方案非常耗时,我需要为我想要开发的廉价项目找到最佳解决方案。如果这是最快的解决方案,我会继续,但我很懒,我希望可以更快地完成一些事情:)
【解决方案2】:

专门查看您的数据访问权限。看起来您想要一个复杂的 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

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2012-06-21
    • 2013-01-18
    相关资源
    最近更新 更多