10

我正在使用 EF4。我想在数据库中插入一个新的 MyObject。MyObject 有两个字段:

ID:int(身份)和名称:字符串

正如我在文档中看到的那样,Entity Framework 应该在调用 SaveChanges() 后将 MyObject.Id 设置为数据库生成的值,但在我的情况下这不会发生。

using (var context = new MyEntities())
{
    var myObject = MyObjects.CreateMyObject(0, "something"); // The first parameter is identity "Id"
    context.MyObjects.AddObject(myObject);
    context.SaveChanges();
    return myObject.Id; // The returned value is 0
}

更新:

这发生在我的一个实体中,其他实体工作正常。顺便说一句,我检查了 DB 列是身份,StoreGeneratedPattern 设置为身份。这是SSDL。我看不出有什么不同。第一个工作不正常:

    <EntityType Name="OrgUnit">
      <Key>
        <PropertyRef Name="Srl" />
      </Key>
      <Property Name="Srl" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="TypeId" Type="smallint" Nullable="false" />
      <Property Name="Name" Type="varchar" Nullable="false" MaxLength="80" />      
    </EntityType>

    <EntityType Name="OrgType">
      <Key>
        <PropertyRef Name="Srl" />
      </Key>
      <Property Name="Srl" Type="smallint" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="Title" Type="varchar" Nullable="false" MaxLength="120" />
      <Property Name="Options" Type="int" Nullable="false" />
    </EntityType>

更新在数据库中成功完成并生成了身份,但实体对象并未使用新身份进行更新。

4

7 回答 7

11

在这种情况下,您的 EF 模型可能不是最新的 - EF 应该自动从数据库中获取您的新 ID。尝试刷新您的 EF 模型。

您的身份列的属性在您的 EDMX 模型中应如下所示:

在此处输入图像描述

于 2011-06-10T13:10:58.150 回答
6

如果您像我一样使用来自 ODP.NET 的 Oracle Entity Framework 4 Provider,那么 Designer 中存在错误。仅在下拉框中选择身份值是不行的。它将用

注释:StoreGeneratedPattern="Identity"

<Property Type="Int32" Name="Id" Nullable="false" cg:SetterAccess="Private" annotation:StoreGeneratedPattern="Identity" />

但是,它不会对存储模型做同样的事情,即。你需要手动完成。在感兴趣的 EntityType 中找到属性(在我的情况下为 ID)并添加StoreGeneratedPattern="Identity"

    <EntityType Name="PROBLEMI">
      <Key>
        <PropertyRef Name="ID" />
      </Key>
      <Property Name="ID" Type="number" Nullable="false" Precision="10" StoreGeneratedPattern="Identity" />

我不知道 SQL EF 提供程序中存在相同的错误,因为我没有使用它。

于 2012-11-28T08:36:55.727 回答
4

这应该“正常工作”。确保 DB 列实际上是IDENTITY,并且StoreGeneratedPattern在 EDMX 中设置为 Identity。

于 2011-06-10T13:06:22.267 回答
2

哇!那是一场噩梦,但最后我解决了,虽然我不明白问题是什么。也许这可以帮助有同样问题的人。

  1. 生成用于创建表及其数据的脚本。
  2. 放下桌子。
  3. 运行脚本。
于 2011-06-11T07:27:18.080 回答
2

如果您使用的是 Linq To Entities,并且即使您遵循了 marc_s 的建议(非常好)也会出现此错误,您应该直接在 edmx(xml 视图)中查看您的实体并检查它们是否具有以下属性:

    <EntityType Name="MyEntity">
      <Key>
        <PropertyRef Name="pk" />
      </Key>
      <Property Name="pk" Type="bigint" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="value" Type="float" Nullable="false" />
    </EntityType>

StoreGeneratedPattern ="Identity"也是必需的。

于 2012-05-23T13:31:33.923 回答
1

我今天遇到了这个。不同之处在于我使用的是插入函数,上面的人没有指定。我必须做的是让我的插入函数存储过程返回 SCOPE_IDENTITY() 并为返回的 id 使用结果绑定。

修复了我的问题。

于 2012-06-05T22:40:24.340 回答
1

在保存更改后尝试使用刷新方法,它已在 MSDN 中记录

“为确保客户端上的对象已被数据源端逻辑更新,您可以在调用 SaveChanges 后调用带有 StoreWins 值的 Refresh 方法。”

http://msdn.microsoft.com/en-us/library/bb336792.aspx

虽然我觉得@Craig 的建议也可能有效。

于 2011-06-10T13:07:05.557 回答