我正在编写一个导出数据的应用程序,并将其序列化为文件以存档旧数据。
在某些情况下,某些原因可能需要重新导入选择数据。由于标识列,这导致了我的问题。
为了解决这个问题,我在事务范围内执行工作。为该表设置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标识>列时,必须为表中的标识列指定显式值。
我假设实体框架试图在不指定列的情况下进行某种块插入。无论如何,在实体框架中这样做。
对象很大,并且有许多相关的实体,它们也被反序列化并需要插入,所以我想让实体框架尽可能地执行此操作,因为它将为我节省大量额外的工作。
感谢任何帮助。
答案 0 :(得分:4)
格特阿诺德 - 这是我的问题的答案。谢谢。
我确实在别处读过,并在对象浏览器中设置了值,所以认为这就足够了。我还通过右键单击.edmx和Open With来仔细检查值,以便在另一篇文章中建议的XML编辑器中查看详细信息。
当我最初检查XML编辑器中的值时,它也是“无”,所以假设这不是我的问题。但是我想进入那里并且保存第一次纠正了这个问题。
在我必须从数据库更新模型后的第二轮,我必须根据您的建议重复此步骤。但第二次StoreGeneratorPattern与对象浏览器中设置的不同,所以我需要在XML中手动更改它。
在我的情况下这很好,因为通常记录是通过另一种机制插入的,因此身份只会妨碍我,因为身份将始终作为旧的(以前存在的)身份值插入恢复。
感谢您的帮助。