ASP.NET MVC自动生成整数

时间:2019-03-06 03:48:55

标签: asp.net asp.net-mvc entity-framework entity-framework-6 entity-framework-4

早上好,这里是一个真正的新手开发人员。

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

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 =服务信函和001 = QueueNumber。谢谢

1 个答案:

答案 0 :(得分: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; }
}

此方法的问题在于,要能够依靠您的Queue来显示QueueNumber,该Queue必须急于加载Service,或者您启用了延迟加载并冒着性能下降的风险,而让Service == #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. 安全性得到了改善,我们向客户端公开的数据不超过预期/需要的数据,并且我们没有为将实体附加到上下文并在未经适当验证的情况下保存的“惰性”更新打开大门。