Вставка идентичности при добавлении многих к многим отношениям EF - PullRequest
0 голосов
/ 10 апреля 2020

Я установил связь «многие ко многим», и таблица была создана с помощью «Классы и пользователи» для веб-приложения для спортзала, но когда я пытаюсь вставить значения в эту таблицу, я получаю SqlException: Невозможно вставить явное значение для столбца идентификации в таблица 'classes', когда для IDENTITY_INSERT установлено значение OFF.

Мои модели относятся к классу

 public class Class
        {
            [Key]
            public int ClassID { get; set; }
            ...
            public List<UserClass> userClasses { get; set; }
      }

Пользователь:

public class User
        {
            [Key]
            public int UserID{ get; set; }
            ...
            public List<UserClass> userClasses { get; set; }
      }

Где они объединяются:

public class UserClass
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long UserClassID { get; set; }

        public int UserID { get; set; }
        public int ClassID { get; set; }

        public User user { get; set; }
        public Class @class { get; set; }
    }

моя функция модели класса контекста:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<UserClass>()
               .HasKey(x => new { x.UserID, x.ClassID });

            //If you name your foreign keys correctly, then you don't need this.
            modelBuilder.Entity<UserClass>()
                .HasOne(uc => uc.user)
                .WithMany(p => p.userClasses)
                .HasForeignKey(uc => uc.UserID);

            modelBuilder.Entity<UserClass>()
                .HasOne(uc => uc.@class)
                .WithMany(t => t.userClasses)
                .HasForeignKey(uc => uc.ClassID);
        }

и эта функция, которую я использую с ajax

public IActionResult BookTheClass(int ClassID)
        {
            User user = _context.users.Find(_auth.User.UserID);
            Class selectedClass = _context.classes.Find(ClassID);

            selectedClass.userClasses = new List<UserClass>() {
                    new UserClass{
                   user=user,
                    @class=selectedClass
                    }
            };
            _context.classes.Add(selectedClass);
            _context.SaveChanges();

            return PartialView("~/Views/PartialViews/ClassBooked.cshtml");
        }

Другие подобные вопросы имели проблему с построителем моделей что у меня нет.

1 Ответ

0 голосов
/ 10 апреля 2020

Столбец идентификатора будет отслеживать следующий свободный номер, и вам не нужно будет генерировать ClassId самостоятельно. Новый идентификатор можно получить с помощью SELECT SCOPE_IDENTITY()

. Если вы действительно хотите вставить значение в столбец идентификаторов ( не рекомендуется ), то вам нужно включить свойство Identity Insert твой стол. Смотрите ниже SQL, чтобы сделать то же самое

SET IDENTITY_INSERT classes ON
...