Как я могу объединить два реквизита в третий реквизит при добавлении в базу данных? - PullRequest
0 голосов
/ 02 февраля 2020

Я создаю свой первый проект, используя ASP. NET Core 3.0, используя EF Core. При создании пользователя (пациента) я хочу, чтобы они могли вводить свои имя и фамилию отдельно в представлении создания, они будут сохранены в моей базе данных в столбцах FirstName и LastName соответственно. Однако я хочу, чтобы оба эти поля были объединены и сохранены в другом столбце с именем FullName, чтобы я мог использовать его для поиска пользователей. Есть ли прямой способ сделать это?

Я пытался использовать приведенный ниже код, но получаю необработанное исключение -

"SqlException: Невозможно вставить значение NULL в столбец« FullName », таблица« WebPMR ». dbo.Patient '; столбец не допускает нулевые значения. INSERT завершается неудачно. Оператор завершен "

Модель:

public class Patient
    {
        public int Id { get; set; }
        [Display(Name = "Title")]
        public int TitleId { get; set; }
        [Required]
        [Display(Name = "First Name")]
        [StringLength(25, MinimumLength = 1, ErrorMessage = "First Name must be 1-25 characters long")]
        public string FirstName { get; set; }
        [Required]
        [Display(Name = "Last Name")]
        [StringLength(50, MinimumLength = 1, ErrorMessage = "Last Name must be 1-50 characters long")]
        public string LastName { get; set; }
        private string _fullName;
        public string FullName 
        {
            get => _fullName;
            set => _fullName = FirstName + " " + LastName;
        }
    }

Контроллер :

// GET: Create
        public IActionResult Create()
        {
            return View();
        }

        // POST:Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("Id,FirstName,LastName")] Patient patient)
        {
            if (ModelState.IsValid)
            {
                _context.Add(patient);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            ViewData["TitleId"] = new SelectList(_context.Title, "Id", "Description", patient.TitleId);
            return View(patient);
        }

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы можете использовать вычисляемый столбец

Table (
    FirstName VARCHAR(128),
    LastName VARCHAR(128),
    FullName AS FirstName + ' ' + LastName
)

Затем вы можете сделать его постоянным , чтобы вы могли создать индекс для него.

https://docs.microsoft.com/en-us/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-ver15

0 голосов
/ 02 февраля 2020

Вы можете добавить атрибут [NotMapped], чтобы указать, что у вас нет такого поля. Кроме того, вместо свойства вы можете использовать его как метод FullName или переопределение ToString ().

Однако при поиске таких данных вы, вероятно, захотите разделить их. Менее распространен поиск по полному имени, и в больничных данных, вероятно, администратор был бы рад получить список пациентов по фамилии.

...