Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF上的InvalidOperationException_C#_.net_Vb.net_Entity Framework - Fatal编程技术网

C# EF上的InvalidOperationException

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(

我正在使用WPF MVVM Pettern和 我在SQL Server 2012上有一个简单的表,它的
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上使用了DatabaseGeneratedAttributenone值,但结果是一样的:(

即使当我重新查询数据库来检查重复的密钥时,我也没有找到任何东西

  • 为何引发此异常?
  • 我该如何防止这种情况发生?
  • 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