3

我正在编写一个应用程序来导出数据并将其序列化为文件以归档旧数据。

在某些情况下,出于某种原因,选择数据可能需要重新导入。由于标识列,这一直给我带来问题。

为了解决这个问题,我在事务范围内执行工作。为该表设置身份插入,然后更新我的事务,例如

using (TR.TransactionScope scope = new TR.TransactionScope(TR.TransactionScopeOption.RequiresNew))
                {
                    // allow transaction nbr to be inserted instead of auto generated                        
                    int i = context.ExecuteStoreCommand("SET IDENTITY_INSERT dbo.Transactions ON");

                    try
                    {
                        // check if it already exists before restoring
                        var matches = context.Transactions.Where(tr => tr.transaction_nbr == t.transaction_nbr);

                        if (matches.Count() == 0)
                        {
                            Transaction original = t;                                
                            context.Transactions.AddObject(original);
                            context.SaveChanges();
                            restoreCount++;

但我收到一个例外说:

当 IDENTITY_INSERT > 设置为 ON 或复制用户插入 NOT FOR REPLICATION 身份 > 列时,必须为表中的身份列指定显式值。

我假设实体框架正在尝试在不指定列的情况下进行某种块插入。无论如何在实体框架中这样做。

该对象很大,并且有许多关联的实体也被反序列化并需要插入,所以如果可能的话,我想让实体框架这样做,因为它可以为我节省很多额外的工作。

任何帮助表示赞赏。

4

1 回答 1

5

Gert Arnold - 这就是我的问题的答案。谢谢你。

我确实在其他地方读过,并在对象浏览器中设置了值,所以认为这就足够了。我还通过右键单击 .edmx 并打开方式仔细检查了该值,以在另一篇文章中建议的 XML 编辑器中查看详细信息。

当我最初检查 XML 编辑器中的值时,它也是“无”,所以假设这不是我的问题。但我想只是进入那里并保存第一次解决了问题。

在我必须从数据库中更新模型之后的第二轮,我不得不根据您的建议重复此步骤。但是第二轮 StoreGeneratorPattern 与对象浏览器中的设置不同,因此我需要在 XML 中手动更改它。

在我的情况下,这很好,因为通常记录是通过另一种机制插入的,所以身份只是妨碍我,因为身份将始终作为临时恢复的旧(曾经存在的)身份值插入。

谢谢你的帮助。

于 2013-09-11T09:02:16.477 回答