Невозможно добавить новую запись с целочисленным значением в базу данных, используя linq из кода C# - PullRequest
2 голосов
/ 07 марта 2020

Я пытаюсь создать простой ASP. NET MVC сайт, но столкнулся с некоторой проблемой. Я не могу добавить новую запись с целочисленным значением в базу данных с помощью команды linq. У меня есть таблица под названием «группы» в базе данных. Это следующее: groups ([int] [primary key] MaNhom, [char (100)] TenNhom). Объясните: MaNhom - это GroupID, TenNhom - это GroupName. (Извините за это удобство, когда я называю эти поля вьетнамцами.). Я добавляю ADO. NET Entity Data Model и генерируется класс с именем 'group.cs'.

public partial class group
    {
        [Key]
        public int MaNhom { get; set; }
        public string TenNhom { get; set; }
    }
}

Я также создаю класс в папке Models моего веб-проекта под названием Group.

public class Group
    {
        [Key]
        public int MaNhom { get; set; }
        public string TenNhom { get; set; }
    }

Я создал представление под названием CreateManageGroup.cs html. Его содержание следующее:

@{
    ViewBag.Title = "CreateManageGroup";
}

<h2>Create A Group</h2>

<form action="/account/CreateManageGroup" method="post">
    <label for="TenNhom"> Name of Group </label>
    <input type="text" name="TenNhom" id="inputGroupName">

    <input type="submit" value="Create">
</form>

Когда я отправляю его, значение TenNhom будет отправлено и сохранено в параметре 'group' метода CreateManageGroup (Group group) в AccountController.

[HttpPost]
        public ActionResult CreateManageGroup(Group group)
        {
            if (ModelState.IsValid == true)
            {
                var newGroup = new DataAccess.group();

                newGroup.TenNhom = group.TenNhom;
                var randomObject = new Random();
                do
                {
                    newGroup.MaNhom = randomObject.Next(1, 9999);
                }
                while (DataAccess.Queries.CheckExistInGroup(newGroup.MaNhom) == true);
                DataAccess.Queries.ExcuteInsertIntoGroup(newGroup);
                return RedirectToAction("SignUp");
            }
            else
            {
                return View();
            }
        }

Я проверил, и я знаю, что newGroup.MaNhom задает значение, отличное от нуля после рандомизации, например 3309. Но после вызова метода ExcuteInsertIntoGroup (newGroup) значение MaNhom групп таблиц в базе данных равно 0. Содержимое ExcuteInsertIntoGroup ():

namespace DataAccess
{
    public class Queries
    {
        public static void ExcuteInsertIntoGroup(group record)
        {

            phep_toanDatabase.groups.Add(record);
            phep_toanDatabase.SaveChanges();
        }
    }
}

Примечание. Phep_toanDatabase - это переменная, объявленная в классе. Запросы к библиотеке классов DataAccess:

public static phep_toanEntities phep_toanDatabase;
        static DataAccess()
        {
            phep_toanDatabase = new phep_toanEntities();
        }

Мой вопрос: почему после исключения команды linq значение MaNhom отображается в группах таблиц как 0, хотя newGroup.MaNhom имеет значение, отличное от 0 до? Спасибо!

1 Ответ

1 голос
/ 07 марта 2020

на самом деле, после публикации моего комментария у меня возникла небольшая мозговая волна, которая могла бы в конечном итоге ответить на ваш вопрос. Это теория:

вы упомянули, что ваша таблица определена следующим образом:

CREATE TABLE groups(
   MaNhom INT primary key,
   TenNhom CHAR(100)
);

, которая дает сущность, правильно украшенную атрибутом [Key]:

public partial class group
    {
        [Key]
        public int MaNhom { get; set; }
        public string TenNhom { get; set; }
    }
}

то, что я подозреваю, происходит, когда вы вызываете EF .SaveChanges (), когда он полностью игнорирует значение id MaNhom, предполагая, что БД позаботится об этом. однако в MySQL PK не будет автоматически увеличиваться, пока вы не скажете это. Вот где вам нужно:

1. таблица обновлений:

CREATE TABLE groups(
   MaNhom INT AUTO_INCREMENT PRIMARY KEY,
   TenNhom CHAR(100)
);

2. обновить модель:

этот ответ SO дает некоторые рекомендации:

public partial class group
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int MaNhom { get; set; }
        public string TenNhom { get; set; }
    }
}
...