Entity Framework, Как я могу получить фактические данные моего класса в другой класс - PullRequest
0 голосов
/ 31 мая 2019

Моя проблема в моих 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

my 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 и генерировать номер очереди.
queuenumber - это комбинация ServiceLetter + MyQueueId на данный момент. Она генерирует меня так, но вместо буквы в начале она показывает мне номер, такой как 1001 вместо A001. мне очень нужна помощь, я застрял.

1 Ответ

0 голосов
/ 31 мая 2019

Подобная структура с вашим QueueNumber не очень хорошая идея, полагаясь на возможное присутствие другого объекта.В EF6 и, возможно, в будущих версиях EF Core это может работать благодаря отложенной загрузке, но даже тогда это не идеально, поскольку отложенная загрузка приведет к проблемам с производительностью.

Предложение 1: если ServiceLetter уникален и важен, иСлужба действует как справочная таблица, и вы хотите использовать 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 для управления ссылками на Сервис, чтобы Очередь могла надежно отслеживать и сохранять 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 во всех записях очереди, которые ссылаются на эту конкретную службу.

Если другие системы могут обновить сервисную ссылку или сервисное письмо, то вы можете использовать процесс проверки работоспособности, выполняемый в базе данных, для поиска номеров очередей, которые не отражают их сервисную ссылку, и обновления этих затронутых номеров очередей.Обычно я структурирую их так, чтобы они вставлялись в таблицу аудита, где обнаружены неверные данные, после чего производится обновление данных для исправления несоответствия.

...