实体框架6无法插入记录

Posted

技术标签:

【中文标题】实体框架6无法插入记录【英文标题】:entity framework 6 can't insert record 【发布时间】:2016-10-31 05:15:57 【问题描述】:

如果我这样定义一个序列和一个表:

CREATE SEQUENCE [dbo].[seq-test] 
 AS [bigint]
 START WITH 0
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE 
GO


CREATE TABLE [dbo].[testTab] 
(
    [iden] [bigint] NOT NULL DEFAULT (NEXT VALUE FOR [seq-test]),
    [name1] [nchar](10) NULL,
    [name2] [nchar](10) NULL,
    PRIMARY KEY CLUSTERED 
    (
    [iden] ASC
    )
) ON [PRIMARY]

然后尝试使用 EF 6 插入数据:

testTab d = new testTab();
d.name1 = "sss";

using (var db = new ABEntities2())

    db.testTabs.Add(d);
    db.SaveChanges();

我将StoreGeneratedPatterniden 列设置为Identity,它的行为不正常,SaveChanges 抛出的异常是DbUpdateConcurrencyException

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目。

我做错了什么?

生成的测试标签:

<EntitySetMapping Name="testTabs">
  <EntityTypeMapping TypeName="ABModel.testTab">
    <MappingFragment StoreEntitySet="testTab">
      <ScalarProperty Name="iden" ColumnName="iden" />
      <ScalarProperty Name="name1" ColumnName="name1" />
      <ScalarProperty Name="name2" ColumnName="name2" />
    </MappingFragment>
  </EntityTypeMapping>
</EntitySetMapping>

【问题讨论】:

你能包含你的 testTabs 类吗? 我认为,您在创建时包含了不需要的括号。 ([识别] ASC)在[主要]上。有一个双重关闭。但一个开口 一对括号用于主键定义,另一个用于创建表——我修改缩进只是为了更好的可读性 【参考方案1】:

我会检查这些东西

    确保正在设置testTabs 类上的[Key]

    确保您没有同时拥有两个不同的 ABEntities2 (DbContext) 实例

【讨论】:

它是自动设置的:&lt;Key&gt; &lt;PropertyRef Name="iden" /&gt; &lt;/Key&gt;【参考方案2】:

看起来唯一的问题是sequence 的使用,因为我将表定义更改为

CREATE TABLE [dbo].[testTab]
(
    [iden] [bigint] identity(1,1) NOT NULL ,
    [name1] [nchar](10) NULL,
    [name2] [nchar](10) NULL,
    PRIMARY KEY CLUSTERED 
    (
    [iden] ASC
    )
) ON [PRIMARY]
所以我使用identity 而不是sequence 并重新创建了模型,一切正常。 sql2012 中引入的sequence 似乎无法正确使用 EF6。

【讨论】:

以上是关于实体框架6无法插入记录的主要内容,如果未能解决你的问题,请参考以下文章

使用AFTER INSERT触发器将实体框架插入表中

实体框架:在插入新记录之前检查记录是不是存在

使用实体框架添加记录时违反链接记录的PRIMARY KEY约束

需要使用实体框架将大量记录插入数据库

在不使用实体框架的多对多中插入记录

在实体框架中批量插入后批量插入记录并获取它们的 ID