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 数据像 A001B002。换句话说,我需要让我的 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,其中发现不正确的数据,然后更新数据以纠正不一致。