我想在指定 Id 的位置插入一些记录,以便将数据迁移到我想要保持现有关系完整性的位置。
为此,我直接在 SSMS 中的表上运行以下命令:
SET IDENTITY_INSERT [CRMTItem] ON;
然而,当我从 C# 插入一个 Id 为 1 的项目时,Id 仍然从 850 左右递增。
我从 EDMX 中删除了实体,并再次从数据库中更新,但结果相同。
这是我的插入代码,如您所见,我确保在插入之前 Id 确实为 1,但这只是被忽略了。
var crmtItem = new CRMTItem();
crmtItem.Id = adv.PrimaryId;
crmtItem.ProjectTitle = adv.ProjectTitle;
crmtItem.CreatedByUser = (adv.CreatedBy == null) ? (Guid?)null : new Guid(adv.CreatedBy);
crmtItem.Opportunity = (adv.Opportunity == null) ? (Guid?)null : new Guid(adv.Opportunity);
crmtItem.BidNoBid = adv.Bnb;
crmtItem.SPUrl = adv.SPUrl;
crmtItem.BnbId = (adv.BnbId == null) ? (Guid?)null : new Guid(adv.BnbId);
crmtItem.Stage = adv.ProjectStage;
crmtItem.Confidential = adv.Confidential;
crmtItem.OpportunityStatus = adv.OpportunityStatus;
crmtItem.OpportunityNumber = adv.OpportunityNumber;
crmtItem.CRMTNumber = adv.CrmtNumber;
crmtItem.ProjectNumber = adv.ProjectNumber;
crmtItem.Sector = adv.Sector;
crmtItem.Service = adv.Service;
crmtItem.CreatedDate = adv.CreatedDate;
crmtItem.Archive = adv.Archive;
crmtItem.ProjectManager = adv.ProjectManager;
crmtItem.WorkTeam = adv.WorkTeam;
crmtItem.Custodian = adv.Custodian;
db.CRMTItems.Add(crmtItem);
if (adv.PrimaryId == 1 || adv.PrimaryId == 2 || adv.PrimaryId == 3)
{
await db.SaveChangesAsync();
}
我还尝试在插入项目之前添加这一行
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[CRMTItem] ON");
但还是不行。
根据我发现的另一个问题,我接下来尝试了这个:
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[CRMTItem] ON");
db.CRMTItems.Add(crmtItem);
if (adv.PrimaryId == 1)
{
await db.SaveChangesAsync();
}
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[CRMTItem] OFF");
transaction.Commit();
现在我得到一个错误
当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表“CRMTItem”中的标识列指定显式值。
我错过了什么吗?为什么控制我自己的数据就这么困难?如果我不能实现这一点,我将被迫在我的表中创建一个临时列,只是为了存储原始(CDS)表中的id,这绝对是荒谬的,毕竟它是MY DATA,为什么我不能选择列的值!?!?!