【问题标题】:EF Core Code First Cannot insert explicit value for identity column in table' when IDENTITY_INSERT is set to OFF当 IDENTITY_INSERT 设置为 OFF 时,EF Core Code First 无法为表中的标识列插入显式值
【发布时间】:2021-07-02 00:13:31
【问题描述】:

我在我的项目中使用代码优先方法。我也在尝试创建动态Create 动作和动态Complete(UnitOfWork) 动作。在我的函数添加第一个值后,我得到了这个错误。 让我向您展示我的功能:

   public void WebFairHallSeatingCreator(int webFairHallID)
        {
            int[] hallSeatingOrderColumnValue = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
            string[] hallSeatingOrderRowValue = { "a", "b", "c", "d", "e", "f", "g" };
            var hallSeatingOrder = new HallSeatingOrder();
            for (int row = 0; row < hallSeatingOrderRowValue.Length; row++)
            {                
                for (int col = 1; col <= hallSeatingOrderColumnValue.Length; col++)
                {
                    if ((hallSeatingOrderRowValue.GetValue(row).ToString() == "c") || (hallSeatingOrderRowValue.GetValue(row).ToString() == "d"))
                    {
                        if ((col == 5) || (col == 6) || (col == 7))
                        {
                            hallSeatingOrder.HallSeatingOrderRowValue = "x";
                            hallSeatingOrder.HallSeatingOrderColumnValue = 15;
                            _unitOfWorkWFH.RepositoryHallSeatingOrder.Create(hallSeatingOrder);
                        }
                        else
                        {
                            hallSeatingOrder.HallSeatingOrderRowValue= hallSeatingOrderRowValue.GetValue(row).ToString();
                            hallSeatingOrder.HallSeatingOrderColumnValue = col;
                            hallSeatingOrder.WebFairHallID = webFairHallID;
                            _unitOfWorkWFH.RepositoryHallSeatingOrder.Create(hallSeatingOrder);
                            _unitOfWorkWFH.Complete();// This is the point

                        }
                    }
                    else
                    {
                        hallSeatingOrder.HallSeatingOrderRowValue = hallSeatingOrderRowValue.GetValue(row).ToString();
                        hallSeatingOrder.HallSeatingOrderColumnValue = col;
                        hallSeatingOrder.WebFairHallID = webFairHallID;
                        _unitOfWorkWFH.RepositoryHallSeatingOrder.Create(hallSeatingOrder);
                        _unitOfWorkWFH.Complete();// This is the point

                    }
                }
            }
        }

这是我的HallSeatingOrder 课程:

  public class HallSeatingOrder : Base
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int HallSeatingOrderID { get; set; }
        [Required]
        public int WebFairHallID { get; set; }
        public int? CompanyID { get; set; }
        [Required]
        public int HallSeatingOrderColumnValue { get; set; }
        [Required]
        public string HallSeatingOrderRowValue { get; set; }
        public bool HallSeatingOrderIsSpecial { get; set; }
        public Company Company { get; set; }
        public WebFairHall WebFairHall { get; set; }
    }
    public class HallSeatingOrderConfiguration : IEntityTypeConfiguration<HallSeatingOrder>
    {
        public void Configure(EntityTypeBuilder<HallSeatingOrder> builder)
        {
            builder.HasKey(x => x.HallSeatingOrderID);
            builder.HasOne(x => x.Company)
                .WithMany(x => x.HallSeatingOrders)
                .HasForeignKey(x => x.CompanyID)
                .OnDelete(DeleteBehavior.NoAction);
            builder.HasOne(x => x.WebFairHall)
                .WithMany(x => x.HallSeatingOrders)
                .HasForeignKey(x => x.WebFairHallID)
                .OnDelete(DeleteBehavior.NoAction);
        }
    }

我已经从我的问题中排除了每一个问题。 我尝试使用ValueGeneratedOnAdd()[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)],但没有一个对我有用。

【问题讨论】:

  • 不要在循环中重复使用单个实体实例来创建多个实体。这个var hallSeatingOrder = new HallSeatingOrder(); 应该在每个调用Create 的块内。
  • 我会试着让你知道@IvanStoev
  • 它真的对我有用。非常感谢

标签: sql asp.net asp.net-core entity-framework-core ef-code-first


【解决方案1】:

感谢@IvanStoev,我解决了这个问题。我的模型和配置没有问题。有一个错误,让我告诉你:

public void WebFairHallSeatingCreator(int webFairHallID)
        {
            int[] hallSeatingOrderColumnValue = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
            string[] hallSeatingOrderRowValue = { "a", "b", "c", "d", "e", "f", "g" };

            for (int row = 0; row < hallSeatingOrderRowValue.Length; row++)
            {                
                for (int col = 1; col <= hallSeatingOrderColumnValue.Length; col++)
                {
                    if ((hallSeatingOrderRowValue.GetValue(row).ToString() == "c") || (hallSeatingOrderRowValue.GetValue(row).ToString() == "d"))
                    {
                        if ((col == 5) || (col == 6) || (col == 7))
                        {
                            var hallSeatingOrder = new HallSeatingOrder();
                            hallSeatingOrder.HallSeatingOrderRowValue = "x";
                            hallSeatingOrder.HallSeatingOrderColumnValue = 15;
                            _unitOfWorkWFH.RepositoryHallSeatingOrder.Create(hallSeatingOrder);
                            _unitOfWorkWFH.Complete();
                        }
                        else
                        {
                            var hallSeatingOrder = new HallSeatingOrder();
                            hallSeatingOrder.HallSeatingOrderRowValue= hallSeatingOrderRowValue.GetValue(row).ToString();
                            hallSeatingOrder.HallSeatingOrderColumnValue = col;
                            hallSeatingOrder.WebFairHallID = webFairHallID;
                            _unitOfWorkWFH.RepositoryHallSeatingOrder.Create(hallSeatingOrder);
                            _unitOfWorkWFH.Complete();

                        }
                    }
                    else
                    {
                        var hallSeatingOrder = new HallSeatingOrder();
                        hallSeatingOrder.HallSeatingOrderRowValue = hallSeatingOrderRowValue.GetValue(row).ToString();
                        hallSeatingOrder.HallSeatingOrderColumnValue = col;
                        hallSeatingOrder.WebFairHallID = webFairHallID;
                        _unitOfWorkWFH.RepositoryHallSeatingOrder.Create(hallSeatingOrder);
                        _unitOfWorkWFH.Complete();

                    }
                }
            }
        }

我需要为每个 for 循环创建 var hallSeatingOrder = new HallSeatingOrder();,仅此而已。 感谢他。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2016-05-13
    • 2012-11-10
    • 2019-03-10
    • 1970-01-01
    • 2016-01-20
    • 2018-06-29
    相关资源
    最近更新 更多