2013-06-03 24 views
3

我有一个使用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> 

奇怪的是,这只发生在我从网格中创建标准项时。我可以使用我的存储库创建一个,它工作得很好。我甚至可以创建完全相同的绑定源结构,并且在没有错误的情况下工作。在这一点上我很难过。有没有人对这里可能发生的事情有任何想法?

+0

你设置StdTermID? –

+0

号StdTermID列不显示给网格中的用户,我在代码中没有对它做任何事情。我认为(并且这通常会让我陷入困境)任何新的标准术语实体将以默认值0创建。如错误消息所示,该项目被添加到数据库表中。 EF似乎在检索分配给项目的密钥创建之后会出现问题。 –

回答

1

我终于发现我的问题,因为我怀疑这是我做的一些愚蠢的事情。在我的模型中,我构建了查询,加载值并返回一个BindingList。我所做的修复它是检查我的BindingList是否为空,如果它是我构建查询,加载值并创建绑定列表。

原始代码

public BindingList<StandardTerm> StandardTerms 
{ 
    get 
    { 
     _uow.StandardTerms.FindAll().Load(); 
     _standardTerms = _uow.StandardTerms.GetBindingList(); 
    } 
} 

正确的代码

public BindingList<StandardTerm> StandardTerms 
{ 
    get 
    { 
     if (_standardTerms == null) 
     { 
      _uow.StandardTerms.FindAll().Load(); 
      _standardTerms = _uow.StandardTerms.GetBindingList(); 
     } 

     return _standardTerms; 
    } 
} 

我的库类实现这将在下面示出的方法GetBindingList。

protected DbSet<T> _set; 
public BindingList<T> GetBindingList() 
{ 
    return _set.Local.ToBindingList(); 
} 

我的实体都依赖于在下面的MDSN文章中描述的ObservableListSource。

EF DataBinding with WinForms

0

另一种选择,产生这样的错误消息来代替触发器添加其上没有Id列一个结果集。例如: - http://i.stack.imgur.com/3GXUw.png

和Entity Framework通过请求以下不会得到ID列。

insert [dbo].[Xxxx]([XxxxId], [FirstName], [LastName], [ProfileUrl], 
     [LastModified], [PictureUrl], [Headline]) 
values (@0, @1, @2, null, @3, null, null) 
select [Id], [Revision] 
from [dbo].[Xxxx] 
where @@ROWCOUNT > 0 and [Id] = scope_identity() 

修正是将Id列添加到RS中。

0

我得到这个错误时,我忘了把它发送到数据库之前标记多列主键字段之一为[Key]

相关问题