我试图使用一个表假设数据库中的帐户表包含20个左右的列,对于不同的视图,我有不同的列的要求,比如对于基本条目,我需要从一个部门插入数据的10列和来自其他部门的5,5列。因此,将有3个视图需要数据或通过模型在表之间进行通信,所以使用什么是最好的方法: 1)创建3个模型,其中一个仅包含10列,其他5-5个? 2)仅使用包含所有列的单个模型。它不会携带不必要的数据吗?
我知道我们可以打破这个表,使用关系来规范化数据,但我只想更多地了解登录模型和用户模型等最佳方法。我们可以使用单个模型来管理这两个模型,因为我们需要用户名和密码字段,但是使用单个模型而不是2个模型是正确的方法吗?
发布于 2019-06-12 07:31:30
模型和ViewModel代表不同的关注点。将它们分开。实体应该反映数据状态,您可以在其中定义视图模型以支持不同的视图关注点。当您通过实体从EF上下文加载视图模型时,您将利用.Select()
,它将为您的视图模型需要的列编写有效的SQL查询。
例如,如果我有一个定义了20多个属性的Account实体,但我想显示一个Account列表,其中只列出了它们的用户名、上次登录时间和角色列表:(这将是一个连接Accounts和roles之间多对多关系的AccountRoles表所引用的角色的"Name“属性)
[Serializable]
public class AccountSummaryViewModel
{
public string AccountName { get; set; }
public DateTime LastLoginDateTime { get; set; }
public ICollection<string> Roles { get; set; } = new List<string>();
}
var accounts = MyContext.Accounts
.Where(x => x.IsActive)
.OrderBy(x => x.AccountName)
.Select(x => new AccountSummaryViewModel
{
AccountName = x.AccountName,
LastLoginDateTime = x.LastLoginDateTime,
Roles = x.Roles.Select(x => x.Role.Name).ToList()
}).ToList();
实体结构反映了您的数据结构,但是当服务器查询这些实体以提供视图时,请为您想要显示的数据结构定义ViewModel,并利用EF组成一个查询来填充该视图模型。
您还可以通过与EF的IQueryable
实现集成的.ProjectTo<T>()
方法来利用Automapper来实现这一点。
EF DbContexts也只能注册一个与单个表关联的实体。要让多种类型的实体指向一个Account表,您需要多个DbContext定义。有界上下文对于大型系统很有用,但如果使用不当,可能会导致上下文引用交织在一起,令人痛苦。
建议避免将实体传递给视图,因为这可能导致各种性能问题、异常和安全漏洞,特别是在控制器操作从客户端接受实体的情况下。通过将实体传递给客户端,服务向客户端传递的信息超过了它所需的数量,您可能会遇到触发延迟加载调用或使用循环引用导致序列化失败的潜在问题。该系统还会告诉黑客/竞争对手更多关于您的数据结构和数据的信息。UI可能不会显示实体中的大多数信息,但它会将所有数据发送到客户端。这需要更多的服务器/客户端内存,以及更大的网络负载。
https://stackoverflow.com/questions/56550916
复制相似问题