Entity Framework, как я могу передать фактические данные моего класса другому классу

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

Итак, вы храните ServiceLetter в своем dbo.MyQueues как 1, 2, 3, но хотите, чтобы они были A, B и C, верно? Тогда почему бы не хранить A, B, C вместо 1, 2 и 3?

vasily.sib 31.05.2019 04:58

это автоматически сгенерировано, я не хранил их. Я просто хочу, чтобы мой ServiceLetter получал все данные, которые я когда-либо вводил в свой Service.ServiceLetter

Carlo Toribio 31.05.2019 05:02

больше похоже на мой класс ServiceLetter на моем dbo.Service, он также будет на моем dbo.MyQeueue

Carlo Toribio 31.05.2019 05:03

как я вижу из вашего кода, вы генерируете QueueNumber ("комбинация ServiceLetter + MyQueueId"), а не ServiceLetter. Кроме того, я вижу "Моя база данных dbo.MyQueues выглядит так" и значения 1, 2 и 3 под заголовком ServiceLetter. Я что-то пропустил?

vasily.sib 31.05.2019 05:12

также я вижу, что вы храните себя ServiceLetter в dbo.Services как A, B и C. Так что еще раз спрошу: почему бы не хранить A, B, C вместо 1, 2 и 3 как ServiceLetter в dbo.MyQueues?

vasily.sib 31.05.2019 05:14

да, я храню свой ServiceLetter как A, B и C в моем dbo.Service, и я хочу привязать его к своему dbo.MyQueue

Carlo Toribio 31.05.2019 05:21

О, теперь я вижу. Итак, вы хотите, чтобы QueueNumber имущество возвращало ServiceLetter ваших Service? Тогда почему бы тебе просто не сделать это? public string QueueNumber => $"{(Service?.ServiceLetter ?? "?")}{MyQueueId:000}";

vasily.sib 31.05.2019 05:24

да, это то, что я хочу сделать.

Carlo Toribio 31.05.2019 05:30

хорошо, тогда просто сделай это. Зачем задавать вопрос?

vasily.sib 31.05.2019 05:31

это не работает, мне показывает что-то вроде этого ?028, ?029

Carlo Toribio 31.05.2019 05:34

хорошо, это значит, что ты Service?.ServiceLetter есть null. Почему это null? Держу пари, потому что ты Service есть null. Почему ваш Service это null? Я думаю, потому что вы на EF Core и забыли загрузить связанную сущность

vasily.sib 31.05.2019 05:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подобная структура с вашим 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 для управления ссылками на Службу, чтобы очередь могла надежно отслеживать и сохранять номер очереди.

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 для всех записей очереди, которые ссылаются на эту конкретную службу.

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

Другие вопросы по теме