美好的一天,这里真的是新手开发者。
我有一个表单,它有一个“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。谢谢
如果需要将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;
这种方法的好处: