在实体框架中禁用外键约束会导致异常

时间:2020-06-24 17:25:22

标签: entity-framework foreign-keys

我想将数据导入SQL Server数据库。数据已经在内存中。我意识到外键约束可能会引起问题。新导入的行可以引用尚未导入的另一行。不错的解决方案是按顺序导入表(如果表引用自身,甚至可以按顺序导入行)。取而代之的是,我尝试使用以下两种方法在导入时禁用外键约束:

public static void TurnOffConstraintCheckInDb()
{
     using (var db = new MainDbContext())
            db.Database.ExecuteSqlCommand("exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'");
}

public static void TurnOnConstraintCheckInDb()
{
     using (var db = new MainDbContext())
            db.Database.ExecuteSqlCommand("exec sp_MSforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'");
}

我在SQL Server Management Studio中检查,关闭约束后,即使还没有结束事务(6000),插入也可以工作。

 INSERT INTO [Transaction] (Id, AccountId, OpeningDate, OriginalOpeningDate, Amount, ClosingTransactionId) 
 VALUES (12346, 500, '2000-12-01', '2000-12-01', 20, 6000)

当我尝试使用程序将数据导入数据库时​​

    public void CopyTablesFromMemoryToDb()
    {
        TurnOffConstraintCheckInDb();

        using (var db = new MainDbContext())
        {
            foreach (var key in TablesDic.Keys)
            {
                var list = TablesDic[key].MemoryList;
                GlobalValues.ExcelTableDic[key].CopyTableFromMemoryToDb(list, db);
                db.SaveChanges();
            }        
        }
        TurnOnConstraintCheckInDb();
    }

某些表已导入,但我的Transaction表却未导入。我收到“由于Lc.Model.Transaction_ClosingTransaction关系的主体端已删除,因此无法插入或更新实体”。有想法吗?

0 个答案:

没有答案