Entity Framework,如何将我的 class 的实际数据传给另一个 class
Entity Framework, How can I get the actual data of my class to another class
我的问题出在我的 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
+ MyQueueId
的组合,这就是为什么我希望我的服务信件保存为字母而不是数字,这样我就可以获得 QueueNumber 数据像 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()
中有我的服务按钮,点击后会转到我的 GetQueueInfo
然后在我的 GetQueueInfo
视图中输入您的姓名,然后单击确认按钮转到 SetQueueInfo
并生成 A queuenumber.
queuenumber 是 ServiceLetter
+ MyQueueId
的组合,截至目前,它生成了我,但不是开始时的字母,而是显示数字 1001
而不是 A001
。在这里急需帮助,我被卡住了。
像您的 QueueNumber 这样的结构依赖于另一个实体的可能存在并不是一个好主意。在 EF6 中,可能在 EF Core 的未来版本中,由于延迟加载,这可能会起作用,但即便如此,它也不理想,因为延迟加载会导致性能问题。
建议 1:如果 ServiceLetter 是唯一且重要的,并且 Service 的行为类似于查找 table,并且您想将 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:如果您的应用程序是数据的唯一保管人(没有其他 system/process 修改数据),则采用 DDD 模式来管理对服务的引用,以便队列可以可靠地跟踪和持久化一个队列编号。
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。
如果其他系统可以更新服务参考或服务信函,那么您可以在数据库上使用健康检查过程 运行 来搜索未反映其服务参考的队列号并更新那些受影响的队列数字。通常我将这些结构化以插入到审计中 table,其中发现不正确的数据,然后更新数据以纠正不一致。
我的问题出在我的 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
+ MyQueueId
的组合,这就是为什么我希望我的服务信件保存为字母而不是数字,这样我就可以获得 QueueNumber 数据像 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()
中有我的服务按钮,点击后会转到我的 GetQueueInfo
然后在我的 GetQueueInfo
视图中输入您的姓名,然后单击确认按钮转到 SetQueueInfo
并生成 A queuenumber.
queuenumber 是 ServiceLetter
+ MyQueueId
的组合,截至目前,它生成了我,但不是开始时的字母,而是显示数字 1001
而不是 A001
。在这里急需帮助,我被卡住了。
像您的 QueueNumber 这样的结构依赖于另一个实体的可能存在并不是一个好主意。在 EF6 中,可能在 EF Core 的未来版本中,由于延迟加载,这可能会起作用,但即便如此,它也不理想,因为延迟加载会导致性能问题。
建议 1:如果 ServiceLetter 是唯一且重要的,并且 Service 的行为类似于查找 table,并且您想将 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:如果您的应用程序是数据的唯一保管人(没有其他 system/process 修改数据),则采用 DDD 模式来管理对服务的引用,以便队列可以可靠地跟踪和持久化一个队列编号。
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。
如果其他系统可以更新服务参考或服务信函,那么您可以在数据库上使用健康检查过程 运行 来搜索未反映其服务参考的队列号并更新那些受影响的队列数字。通常我将这些结构化以插入到审计中 table,其中发现不正确的数据,然后更新数据以纠正不一致。