Моя проблема в моем 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
получал все данные, которые я когда-либо вводил в свой Service.ServiceLetter
больше похоже на мой класс ServiceLetter на моем dbo.Service
, он также будет на моем dbo.MyQeueue
как я вижу из вашего кода, вы генерируете QueueNumber
("комбинация ServiceLetter + MyQueueId"), а не ServiceLetter
. Кроме того, я вижу "Моя база данных dbo.MyQueues выглядит так" и значения 1
, 2
и 3
под заголовком ServiceLetter
. Я что-то пропустил?
также я вижу, что вы храните себя ServiceLetter
в dbo.Services
как A
, B
и C
. Так что еще раз спрошу: почему бы не хранить A
, B
, C
вместо 1
, 2
и 3
как ServiceLetter
в dbo.MyQueues
?
да, я храню свой ServiceLetter как A
, B
и C
в моем dbo.Service
, и я хочу привязать его к своему dbo.MyQueue
О, теперь я вижу. Итак, вы хотите, чтобы QueueNumber
имущество возвращало ServiceLetter
ваших Service
? Тогда почему бы тебе просто не сделать это? public string QueueNumber => $"{(Service?.ServiceLetter ?? "?")}{MyQueueId:000}";
да, это то, что я хочу сделать.
хорошо, тогда просто сделай это. Зачем задавать вопрос?
это не работает, мне показывает что-то вроде этого ?028
, ?029
хорошо, это значит, что ты Service?.ServiceLetter
есть null
. Почему это null
? Держу пари, потому что ты Service
есть null
. Почему ваш Service
это null
? Я думаю, потому что вы на EF Core
и забыли загрузить связанную сущность
Подобная структура с вашим 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 для всех записей очереди, которые ссылаются на эту конкретную службу.
Если другие системы могут обновить ссылку на службу или сервисное письмо, вы можете использовать процесс проверки работоспособности, запущенный в базе данных, для поиска номеров очередей, которые не отражают их ссылку на службу, и обновить эти затронутые номера очередей. Обычно я структурирую их так, чтобы вставить в таблицу аудита, где обнаружены неверные данные, а затем обновить данные, чтобы исправить несоответствие.
Итак, вы храните
ServiceLetter
в своемdbo.MyQueues
как1
,2
,3
, но хотите, чтобы они былиA
,B
иC
, верно? Тогда почему бы не хранитьA
,B
,C
вместо1
,2
и3
?