我正在使用EF4。我想在数据库中插入一个新的MyObject。 MyObject有两个字段:
Id:int(身份)和 名称:字符串
正如我在文档中看到的,实体框架应该在调用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设置为Identity。 这是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>
更新在数据库中成功完成,并生成标识但实体对象未使用新标识更新。
答案 0 :(得分:11)
在这种情况下,您的EF模型可能不是最新的 - EF应该自动从数据库中获取您的新ID。尝试刷新您的EF模型。
您的标识列的属性在EDMX模型中应如下所示:
答案 1 :(得分:6)
如果您正在使用Oracle Entity Framework 4 Provider,就像我一样,从ODP.NET,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提供程序中存在同样的错误,因为我没有使用它。
答案 2 :(得分:4)
这应该“正常工作”。确保数据库列实际为IDENTITY
,并且StoreGeneratedPattern
在EDMX中设置为“身份”。
答案 3 :(得分:2)
哇!这是一场噩梦,但最后我解决了它,虽然我不明白问题是什么。也许这可以帮助有同样问题的人。
答案 4 :(得分:2)
如果您正在使用Linq To Entities,即使您遵循marc_s的建议(非常好)也会收到此错误,您应该直接在edmx(xml视图)中查看您的entites并检查它们是否具有以下属性:
<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”也是必需的。
答案 5 :(得分:1)
尝试使用保存更改后的刷新方法,它已在MSDN中记录
“为了确保客户端上的对象已被数据源端逻辑更新,您可以在调用SaveChanges后使用StoreWins值调用Refresh方法。”
http://msdn.microsoft.com/en-us/library/bb336792.aspx
虽然我觉得@Craig所建议的也可能有用。
答案 6 :(得分:1)
我今天遇到了这个。不同之处在于我使用的是插入函数,上面的人没有指定。我要做的是让我的insert函数存储过程返回SCOPE_IDENTITY()并对返回的id使用结果绑定。
解决了我的问题。