实体框架和身份插入

Pau*_*ery 3 frameworks entity entity-framework insert

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

有时可能出于某种原因需要重新导入选择数据。由于标识列,这给我带来了问题。

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

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++;
Run Code Online (Sandbox Code Playgroud)

但我收到一个例外说:

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

我假设实体框架试图在不指定列的情况下进行某种块插入。无论如何在实体框架中执行此操作。

该对象很大,并且有许多关联的实体,这些实体也被反序列化并需要插入,所以我希望尽可能让实体框架执行此操作,因为它可以为我节省大量额外的工作。

任何帮助表示赞赏。

Pau*_*ery 5

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

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

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

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

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

谢谢你的帮助。