我必须能够设置要添加到列表“ final_zones”中的实体的主键。我有一个控制器构造函数,如下所示:

    public UtilController(CFETSContext context)
    {
        _context = context;
    }
     ......Then in a web api method.........
        using (var transaction = _context.Database.BeginTransaction())
        {
            _context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [CFETSWeb].[dbo].[Zone] ON");

            _context.SaveChanges();
            transaction.Commit();
        }


       using (var transaction = _context.Database.BeginTransaction())
        {
            _context.Zones.AddRange(final_zones);
            _context.SaveChanges(); //ERROR HERE
            transaction.Commit();
        }


无论我做什么,似乎都无法打开IDENTITY_INSERT。我收到以下错误:

{"Cannot insert explicit value for identity column in table 'Zone' when IDENTITY_INSERT is set to OFF."}


我似乎无法将其关闭。我可以在控制器中的数据库中添加实体,所以我知道其他所有东西都在工作。我已经尝试过在没有交易的情况下进行同样的操作。

 _context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [CFETSWeb].[dbo].[Zone] ON");
_context.Zones.AddRange(final_zones);
        _context.SaveChanges();


有任何想法吗?我不知所措,下一步该怎么做。谢谢。

最佳答案

我用以下方法解决了它:

       using (var dbContextTransaction = _context.Database.BeginTransaction())
        {
            try
            {
                _context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [CFETSWeb].[dbo].[Zone] ON");
                _context.Zones.AddRange(final_zones);
                _context.SaveChanges();

                dbContextTransaction.Commit();
            }
            catch (Exception e)
            {
                dbContextTransaction.Rollback();
            }
        }


注意:您必须按表执行此操作。似乎一次只能为1个表设置IDENTITY_INSERT,因此您可以通过这种方式进行设置,也可以在同一事务中将其切换为OFF。

同样,IDENTITY_INSERT必须处于事务中,因为它仅在事务期间保持打开状态。

关于entity-framework - EF 7身份插入问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39023922/

10-17 02:26