实体框架和身份插入

时间:2013-09-10 09:39:50

标签: entity-framework frameworks insert entity

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

在某些情况下,某些原因可能需要重新导入选择数据。由于标识列,这导致了我的问题。

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

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标识>列时,必须为表中的标识列指定显式值。

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

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

格特阿诺德 - 这是我的问题的答案。谢谢。

我确实在别处读过,并在对象浏览器中设置了值,所以认为这就足够了。我还通过右键单击.edmx和Open With来仔细检查值,以便在另一篇文章中建议的XML编辑器中查看详细信息。

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

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

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

感谢您的帮助。