我想将数据导入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关系的主体端已删除,因此无法插入或更新实体”。有想法吗?