首页 > 解决方案 > 添加多对多关系EF时的身份插入

问题描述

我建立了多对多关系,并且该表是使用健身房 Web 应用程序的类和用户创建的,但是当我尝试向该表插入值时,我得到SqlException:当 IDENTITY_INSERT 时,无法在表“类”中插入标识列的显式值设置为关闭。

我的模型是类

 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; }
    }

我的上下文类modelbiulder函数:

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");
        }

其他类似的问题有一个我没有的模型构建器问题。

标签: c#entity-frameworkentity-framework-6

解决方案


标识列会跟踪下一个空闲号,您不需要自己生成 ClassId。新的 id 可以通过SELECT SCOPE_IDENTITY()

如果您真的想向标识列插入值(不推荐),那么您必须打开Identity Insert表的属性。请参阅下面的 SQL 以执行相同的操作

SET IDENTITY_INSERT classes ON

推荐阅读