C# EF上的InvalidOperationException
我正在使用WPF MVVM Pettern和 我在SQL Server 2012上有一个简单的表,它的C# EF上的InvalidOperationException,c#,.net,vb.net,entity-framework,C#,.net,Vb.net,Entity Framework,我正在使用WPF MVVM Pettern和 我在SQL Server 2012上有一个简单的表,它的ID(key)列是在一个名为PersonInsert的StoredProcess中计算的:(这是一个简化的表,但计算的比这个表更复杂,反正它最后是一个int) 在.net端,我首先使用EF 6.1代码来处理数据并映射到SPs,因此我有onmodel创建,如下所示: modelBuilder.Entity(Of Person)().MapToStoredProcedures(
ID
(key)列是在一个名为PersonInsert
的StoredProcess中计算的:(这是一个简化的表,但计算的比这个表更复杂,反正它最后是一个int
)
在.net端,我首先使用EF 6.1代码来处理数据并映射到SPs,因此我有onmodel创建
,如下所示:
modelBuilder.Entity(Of Person)().MapToStoredProcedures(
Sub(x)
x.Insert(Function(e) e.HasName("[dbo].[PersonInsert]"))
x.Update(Function(e) e.HasName("[dbo].[PersonUpdate]"))
x.Delete(Function(e) e.HasName("[dbo].[PersonDelete]"))
End Sub)
我的模型是:
<Table("Person")> _
Partial Public Class Person
<DatabaseGenerated(DatabaseGeneratedOption.None), Key> _
Public Property ID As Integer
Public Property FName As String
Public Property LName as String
End Class
_
部分公众阶级人士
_
作为整数的公共属性ID
公共属性FName作为字符串
公共属性名称为字符串
末级
现在奇怪的是,当我第一次尝试插入数据(添加新人)时,db.SaveChanged()
工作得很好,但第二次它抛出了一条消息invalidooperation异常:
已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态。内部异常消息:保存或接受更改失败,因为“Shoniz.Guard.WPFGuardApplication.Person”类型的多个实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用“HasDatabaseGeneratedOption”fluent API或“DatabaseGeneratedAttribute”进行代码优先配置
他是对的!数据成功提交了!我也是对的,因为我的ID
(key)列计算正确并且是完全唯一的。或者我在ID上使用了DatabaseGeneratedAttribute和none值,但结果是一样的:(
即使当我重新查询数据库来检查重复的密钥时,我也没有找到任何东西
db.SaveChanges()
之后是否仍然可以忽略更改?首先,将
DatabaseGeneratedOption.None
更改为DatabaseGeneratedOption.Indetity
最后将存储过程更改为:
BEGIN TRY
SELECT @ID = ISNULL(MAX(ID), 0) + 1
FROM dbo.Person
INSERT INTO [dbo].[Person]
( [ID] ,
[FName] ,
[LName]
)
VALUES ( @ID ,
@FName ,
@LName
)
--You have to tell EF this is returned Id of inserted person
SELECT @ID as ID
END TRY
真的,谢谢Mohandes,我不知道如何告诉EF这是我新生成的ID。我认为SELECT@ ID必须返回新的ID到EF,因此我试图使我的模型可以观察到(使用NoItIFyPerfTyTrchange),但我没有考虑到在使用SELECT之前没有从SQL返回值。再次感谢:
BEGIN TRY
SELECT @ID = ISNULL(MAX(ID), 0) + 1
FROM dbo.Person
INSERT INTO [dbo].[Person]
( [ID] ,
[FName] ,
[LName]
)
VALUES ( @ID ,
@FName ,
@LName
)
--You have to tell EF this is returned Id of inserted person
SELECT @ID as ID
END TRY