我有一个使用EF5,.NET 4和SQL Server 2008的winforms应用程序。我在数据库中具有以下表\实体。下面显示了创建表的T-SQL。对数据库的更改已成功提交,但更新对象上下文时发生错误
CREATE TABLE [Admin].[StandardTerms](
[StdTermID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Description] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_StandardTerms] PRIMARY KEY CLUSTERED
(
[StdTermID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我使用的BindingSource对象链接到一个数据网格,允许用户创建新的标准条款形式。当用户创建一个新的标准术语并尝试保存它时,出现以下错误。
对数据库的更改已成功提交,但更新对象上下文时发生错误。 ObjectContext可能处于不一致的状态。内部异常消息:由于对象的键值与ObjectStateManager中的另一个对象冲突,因此AcceptChanges无法继续。在调用AcceptChanges之前确保键值是唯一的。
标准术语表的主键是自动生成的整数。我检查了SSDL并确保StoreGeneratedPattern在实体上定义。
<EntityType Name="StandardTerms">
<Key>
<PropertyRef Name="StdTermID" />
</Key>
<Property Name="StdTermID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="Description" Type="nvarchar" Nullable="false" MaxLength="100" />
</EntityType>
奇怪的是,这只发生在我从网格中创建标准项时。我可以使用我的存储库创建一个,它工作得很好。我甚至可以创建完全相同的绑定源结构,并且在没有错误的情况下工作。在这一点上我很难过。有没有人对这里可能发生的事情有任何想法?
你设置StdTermID? –
号StdTermID列不显示给网格中的用户,我在代码中没有对它做任何事情。我认为(并且这通常会让我陷入困境)任何新的标准术语实体将以默认值0创建。如错误消息所示,该项目被添加到数据库表中。 EF似乎在检索分配给项目的密钥创建之后会出现问题。 –