- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我指定 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");
但是还是不行。
根据我发现的另一个 SO 问题,我接下来尝试了这个:
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();
现在我得到一个错误
Explicit value must be specified for identity column in table 'CRMTItem' either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column.
我错过了什么吗?为什么控制我自己的数据如此困难?如果我做不到这一点,我将被迫在我的表中创建一个临时列来存储原始 (CDS) 表中的 id,这绝对是荒谬的,毕竟它是我的数据,为什么我不能选择列的值!?!?!
最佳答案
当您从数据库生成模型时 - Entity Framework 将使用 StoreGeneratedPattern.Identity
将所有标识列映射到模型属性。在您的情况下,据我了解,此类属性是 crmtItem.Id
。当您插入 crmItem
- Entity Framework 将忽略您为标识属性设置的值(如果您设置了任何值),因为它知道该值是由数据库提供的,所以它知道它是否尝试在插入语句 - 数据库将返回错误。
Entity Framework 不了解IDENTITY_INSERT
,因此它将始终根据目标模型属性的StoreGeneratedPattern
元数据行事。如果它是 Identity
或 Computed
- 无论您做什么,它都不会在插入中为其提供值(value)。如果它设置为 None
- 那么它将提供一个值(无论如何)。
因此,对于您的情况,您需要在 EDMX 设计器中为目标属性 (CRMTItem.Id
) 将此属性设置为 None
。当然,这样做之后 - 您必须在插入时始终提供此值。
问题的另一部分,IDENTITY_INSERT
不被尊重,你已经解决了,但仍然值得一些解释。此设置是 session 范围的,因此当您只是在 SSMS 中执行它然后尝试从您的应用程序插入时 - 它没有效果:SSMS 和您的应用程序位于不同的 session 中。
当你这样做的时候:
db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[CRMTItem] ON");
这仍然在单独的 session 中执行,而不是在您的 SaveChanges
执行的同一 session 中。因此,要在同一 session 中同时执行 IDENTITY_INSERT
和 SaveChanges
- 您需要将它们包装在事务中,正如您已经知道的那样。
关于c# - SET IDENTITY_INSERT [table] ON 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49123642/
我在数据库中有一张表 Foo命名 Bar ,其中有一列名为 ID ,它是主键,这个数据库存在于开发 SQL Server 上。 我正在尝试将数据从我们的生产服务器复制到开发服务器,以便我可以使用所述数
这个问题在这里已经有了答案: Set start value for column with autoincrement (4 个回答) 3年前关闭。 我在 SQL Server 上工作,我想将一些行
我在 SQL Server 2012 和 2008 R2 中运行存储过程时遇到问题,而它在 SQL Server 2000 和 2005 中运行良好。 请参阅下面的代码: SELECT * INTO
是否可以在表触发器中打开它? 我尝试创建一个触发器SET IDENTITY_INSERT 表名打开 但是当我打开触发器定义时,我发现该语句不存在.... 这是我更改触发器以添加 IDENTITY_IN
我有一个脚本,可以创建整个数据库并将所有记录插入到几十个表中。它工作得很好,除非在处理过程中出现一些问题,并且当脚本在插入期间失败且在再次设置为 OFF 之前,表会保持 IDENTITY_INSERT
我的数据库中有几个表只包含“元数据”。例如,我们有不同的组类型、contentItemTypes、语言等。 问题是,如果您使用自动编号,则可能会产生间隙。id 在我们的代码中使用,因此数字非常重要。
我不太熟悉 SQL Server,但我正在编写一个脚本,该脚本在 IDENTITY ON 的表上显式设置插入值。由于一些计划不周的架构 - 看起来我将不得不显式插入一些任意高的数字(例如 10,000
我有一个 MVC Web 应用程序,模型中有一个表,我想添加到其中。我设置了主键和其他数据字段,但每次尝试添加到表中时,都会出现以下错误: “当 IDENTITY_INSERT 设置为 OFF 时,无
这是我的数据库脚本, CREATE TABLE [dbo].[MyTable]( [ID] [int] IDENTITY(1,1) NOT NULL, [Code] [nvarchar](25) NU
我目前正在从事一个数据迁移项目,对于与性能相关的问题,我想预定义一组身份,而不是让表生成它们。 我发现将 identity 属性添加到列中并不容易,所以我想使用 IDENTITY_INSERT ON
我正在使用数据集插入从旧数据库转换而来的数据。要求是维护当前的 Order_ID 编号。 我尝试过使用: SET IDENTITY_INSERT orders ON; 当我在 SqlServer Ma
我有一个已删除的文件存档数据库,用于存储已删除文件的 ID,我希望管理员能够恢复该文件(以及用于链接文件的相同 ID)。我不想将 Identity_insert 从整个表中删除,因为增量 1 效果很好
我正在尝试使用带有服务引用的 Silverlight C# 在 SQL 表中创建一个包含数据的新行。我收到以下错误: IDENTITY_INSERT is set to OFF. 但我希望自动提供 C
数据库中的“类别”表定义如下: CategoryID - PK ,identity specification ON (only this column has identity) Descri
我不熟悉 postgresql 脚本。 我已经在 ms sql server 中使用了这个脚本: SET IDENTITY_INSERT my_table ON INSERT INTO my_tabl
情况 我有一个 SQL 脚本,我需要将一些基本数据推送到我的数据库。因此,我使用以下脚本(和其他脚本)。我想为我手动创建的行手动提供一个主键。 问题 如果我执行脚本,它会提示我需要启用 IDENTIT
我正在尝试将订单详细信息插入我的数据库,但它一直在说: Cannot insert explicit value for identity column in table 'Orders' when
首先,我要求管理员删除此帖子: '我如何制作主键作为自动增量在 vb-net-2008/959787#959787' 因为我遇到了评论问题,当我尝试添加评论时,错误消息很明显:“评论需要 50 个声望
我有一个存储过程,我想授予它插入身份的权限,同时不授予调用它的受限用户 ALTER TABLE 权限。这可能吗? 这是我的存储过程: CREATE PROCEDURE [dbo].[AddIntern
我想将表 Equipment 从一个数据库 MyDBQA 复制到我们的测试数据库 MyDB。表中有一个标识列,它是主键(int,不为空)。 但是我得到了一个错误: Msg 8101, Level 16
我是一名优秀的程序员,十分优秀!