ASP.NET MVC Auto生成整数

问题描述 投票:0回答:1

美好的一天,这里真的是新手开发者。

我有一个表单,它有一个“QueueNumber”的实体可以有人告诉我如何编码,以便当我保存我的表单时,它自动生成QueueNumber +前缀,顺便说一下我的前缀实体在另一个类

public class Queue
{
    public int QueueId { get; set; }
    [Required]
    public string Name { get; set; }
    public string QueueNumber

    public int ServiceId { get; set; }

    public Service Service { get; set; }
}

-

public class Service
{
    public int ServiceId { get; set; }

    [Display(Name = "Service Name")]
    public string ServiceName { get; set; }

    [Display(Name = "Service Letter")]
    public string ServiceLetter { get; set; }

    [Display(Name = "Status")]
    public bool? Status { get; set; }

    [Display(Name = "Assigned Location")]
    public int? LocationId { get; set; }


    public virtual Location Location { get; set; }
    public virtual ICollection<Customer> Customer { get; set; }
}

数据库中的结果:1。A001 2. A002 3. A003

我只是想能够自动生成一个队列号,当我在数据库中保存时,它就像A = Service Letter和001 = QueueNumber。谢谢

asp.net asp.net-mvc entity-framework entity-framework-6 entity-framework-4
1个回答
0
投票

如果需要将QueueNumber持久保存到表中,那么我将其设置为计算列,以便数据库可以管理计算它并在基础字段更改时更新它。

如果它只是你想要在UI中表示的东西,那么我建议让视图模型计算这个。

实体可以使用[NotMapped]属性计算类似的内容。例如:

public class Queue
{
    public int QueueId { get; set; }
    [Required]
    public string Name { get; set; }

    [NotMapped]
    public string QueueNumber
    {
        get { return string.Format("{0}{1:000}", Service?.ServiceLetter ?? "?", QueueId); 
    } 
    [ForeignKey("Service")]
    public int ServiceId { get; set; }
    public Service Service { get; set; }
}

这种方法的问题在于,为了能够依赖你的队列来显示QueueNumber,队列必须急切加载服务,或者你启用延迟加载并且冒着性能损失与服务== #null并获得异常的风险或者QueueNumber结果无效。在上面的例子中,如果服务没有急切加载,你会得到类似“?001”的东西。

我更喜欢使用ViewModels有很多原因,包括性能,安全性和处理条件,这样更干净。

例如,给定一个QueueViewModel:

[Serializable]
public sealed class QueueViewModel 
{
    public int QueueId{ get; set; }
    public string Name { get; set; }
    public string ServiceName { get; set; }
    public string ServiceLetter { get; set; }
    public string QueueNumber 
    {
        return string.Format("{0}{1:000}", ServiceLetter, QueueId);
    }
}

然后在读取数据时,我们不会将实体传递给视图,我们传递视图模型...

var viewModel = context.Queues
    .Where(x => x.QueueId == queueId)
    .Select(x => new QueueViewModel
    {
        QueueId = x.QueueId,
        Name = x.Name,
        ServiceName = x.Service.Name,
        ServiceLetter = x.Service.ServiceLetter
    }).Single();
return viewModel;

这种方法的好处:

  1. 我们不必担心急切/延迟加载。查询提取所需的所有内容,我们的视图模型可以计算加载数据所需的任何内容。 (如果您愿意,查询也可以计算值,但要注意查询必须能够转到SQL的限制,因此没有用户函数等)
  2. 性能得到改善,因为查询只返回所需的数据而不是整个实体图,并且没有延迟加载命中。
  3. 安全性得到改善,我们不会向客户端公开比预期/需要更多的数据,并且我们没有为“懒惰”更新打开大门,其中实体附加到上下文并在没有适当验证的情况下保存。
© www.soinside.com 2019 - 2024. All rights reserved.