如果您看到我的dbo.MyQueues
数据是
显示数字而不显示字母。
我的ServiceLetter
数据库看起来像这样。
dbo.Services
我的ServiceId - ServicesName - ServiceLetter
1 - Admin Concerns - A
2 - Engineering - B
3 - Payments - C
public class Service
{
public int ServiceId { get; set; }
public string ServiceName { get; set; }
public string ServiceLetter { get; set; }
}
数据库看起来像这样。
dbo.MyQueues
我希望我的MyQueueId - Name - QueueNumber - ServiceId - ServiceLetter
1 - John - 1001 - 1 - 1
2 - Doe - 1002 - 2 - 2
3 - Jack - 1003 - 3 - 3
public class MyQueue
{
public int MyQueueId { get; set; }
public string Name { get; set; }
public string QueueNumber
{
get
{
return string.Format("{0}{1:000}", ServiceLetter ?? "?", MyQueueId);
}
set { }
}
public static Queue<MyQueue> todayQueue = new Queue<MyQueue>();
public int ServiceId { get; set; }
public string ServiceLetter { get; set; }
public virtual Service Service { get; set; }
}
数据看起来像这样。
dbo.MyQueues
我的MyQueueId - Name - QueueNumber - ServiceId - ServiceLetter
1 - John - A001 - 1 - A
2 - Doe - B002 - 2 - B
3 - Jack - C003 - 3 - C
是我的QueueNumber
+ ServiceLetter
的组合,这就是为什么我希望我的服务字母另存为A字母而不是A编号的原因,以便我可以拥有{ {1}},MyQueueId
。换句话说,我需要将A001
放在我的B002
上,以使其立即成为其显示编号的字母。
这是我的控制人:
ServiceLetter
这里的情况是这样。
在我的dbo.MyQueue
中有我的服务按钮,单击该按钮将转到我的public class KiosksController : Controller
{
private DBContext db = new DBContext();
public ActionResult Index()
{
var services = db.Services;
return View(services.ToList());
}
[HttpGet]
public ActionResult GetQueueInfo(int? id, string ServiceLetter)
{
ViewBag.ServiceLetter = new SelectList(db.Services, "ServiceId", "ServiceLetter", id, ServiceLetter);
ViewBag.ServiceId = new SelectList(db.Services, "ServiceId", "ServiceName", id);
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SetQueueInfo([Bind(Include = "QueueId,Name,QueueNumber,ServiceId,ServiceLetter")] MyQueue queue/*, int? id,string Name, string QueueNumber, string ServiceLetter, int ServiceId*/, int? id)
{
if (ModelState.IsValid)
{
MyQueue.todayQueue.Enqueue(queue);
MyQueue.todayQueue.Count();
db.Queues.Add(queue);
db.SaveChanges();
return View(queue);
}
return View();
}
}
,然后在我的index()
的视图中输入您的姓名,然后单击确认按钮转到{{1 }}并生成一个队列号。
截至目前,queuenumber是GetQueueInfo
+ GetQueueInfo
的组合,它产生了我,但不是在开始时显示字母,而是像SetQueueInfo
而不是ServiceLetter
那样显示字母。这里急需帮助,我被困住了。
答案 0 :(得分:0)
依靠QueueNumber这样的结构并不是一个好主意,它依赖于另一个实体的可能存在。在EF6中以及可能在将来的EF Core版本中,由于延迟加载,它可能会起作用,但是即使那样,它也不理想,因为延迟加载会导致性能问题。
建议1:如果ServiceLetter是唯一且重要的,并且Service充当查找表,并且您希望将ServiceLetter用作另一个键的一部分;使用ServiceLetter作为PK。
public class Service
{
[Key]
public char ServiceLetter { get; set; }
public string ServiceName { get; set; }
}
public class MyQueue
{
public int MyQueueId { get; set; }
public string Name { get; set; }
[ForeignKey("Service")]
public char? ServiceLetter { get; set; }
public virtual Service Service { get; set; }
[NotMapped]
public string QueueNumber
{
get
{
return string.Format("{0}{1:000}", ServiceLetter.HasValue ? ServiceLetter.Value : "?", MyQueueId);
}
}
}
通过这种方式,队列可以知道服务字母,并且可以在保持服务FK完整性的同时对其进行访问。
建议2:如果您的应用程序是数据的唯一托管人(没有其他系统/进程修改数据),则采用DDD模式来管理对Service的引用,以便Queue能够可靠地跟踪和保持QueueNumber。>
public class Service
{
[Key]
public int ServiceId { get; set; }
public char ServiceLetter { get; set; }
public string ServiceName { get; set; }
}
public class MyQueue
{
public int MyQueueId { get; internal set; }
public string Name { get; internal set; }
public virtual Service Service { get; internal set; }
// Persisted to the MyQueue table.
public string QueueNumber { get; internal set; }
public void UpdateService(Service service)
{
Service = service;
QueueNumber = string.Format("{0}{1:000}", service?.ServiceLetter ?? "?", MyQueueId);
}
}
DDD方法将更新限制为方法,由此更新服务的方法可以计算队列号。如果可以在现有服务上更新服务信函,则需要逻辑来触发所有引用该特定服务的队列条目上的UpdateService。
如果其他系统可以更新服务参考或服务字母,则可以利用数据库上运行的运行状况检查过程来搜索不反映其服务参考的队列号并更新那些受影响的队列号。通常,我将其结构化以插入到审计表中,在该表中找到不正确的数据,然后更新数据以更正不一致的地方。