0

我正在考虑用 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)

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

4

2 回答 2

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 的头发颜色.

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

我希望这有帮助

于 2013-01-14T11:07:40.837 回答
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 的仪式。我建议你看看南希

于 2013-01-14T13:17:53.587 回答