EF(6.1)代码优先存储过程问题

时间:2014-05-12 14:20:47

标签: c# entity-framework stored-procedures ef-code-first

所以我对EF 6.1采用了逆向工程(代码优先)方法。我使用POCO生成器VS Extension从现有数据库生成(逆向工程)我的表等。

在我的上下文类中,我调用了为Insert,Delete和Update事件连接的存储过程,这是有问题的:

modelBuilder.Entity<StandardAdditionalInformation>().MapToStoredProcedures(s => 
            s.Insert(u => u.HasName("standard_additionalinformation_save")
                    .Parameter(p => p.Notes, "Notes")
                    .Parameter(p => p.StandardOptout, "StandardOptout")
                    .Parameter(p => p.StandardOptoutReason, "StandardOptoutReason")
                    .Parameter(p => p.IsDeleted, "IsDeleted")
                    .Parameter(p => p.CreateDate, "CreateDate")
                    .Parameter(p => p.CreatedByAccountId, "CreatedByAccountId")
                    .Parameter(p => p.UpdateDate, "UpdateDate")
                    .Parameter(p => p.ModifiedByAccountId, "ModifiedByAccountId")
            ).Update(u => u.HasName("standard_additionalinformation_save")
                    .Parameter(p => p.StandardId, "StandardId")
                    .Parameter(p => p.ClassId, "ClassId")
                    .Parameter(p => p.Notes, "Notes")
                    .Parameter(p => p.StandardOptout, "StandardOptout")
                    .Parameter(p => p.StandardOptoutReason, "StandardOptoutReason")
                    .Parameter(p => p.IsDeleted, "IsDeleted")
                    .Parameter(p => p.CreateDate, "CreateDate")
                    .Parameter(p => p.CreatedByAccountId, "CreatedByAccountId")
                    .Parameter(p => p.UpdateDate, "UpdateDate")
                    .Parameter(p => p.ModifiedByAccountId, "ModifiedByAccountId")
            ).Delete(u => u.HasName("standard_additionalinformation_delete")
                    .Parameter(p => p.StandardId, "StandardId")
                    .Parameter(p => p.ClassId, "ClassId")
        ));

所以,基本上,调用存储过程非常简单     。db.Set()添加(值);     //其中value是StandardAdditionalInformation对象。     db.SaveChanges();

对于绝大多数电话(99%),这将是一次更新。

我的问题在于:当我致电更新时,我发现了例外:

Procedure or function standard_additionalinformation_save has too many arguments specified.

因此,在进一步挖掘,运行SQL跟踪等之后,我想到了这是ACTUAL更新调用:

exec [dbo].[gsp_dal_teacherclass_standard_additionalinformation_save] @StandardId=12,@ClassId=1,@Notes=N'blah',@StandardOptout=0,@StandardOptoutReason=N'',@IsDeleted=0,@CreateDate='2014-05-02 13:03:00',@CreatedByAccountId=34068,@UpdateDate='2014-05-12 10:05:04.6067328',@ModifiedByAccountId=34068,@StandardAdditionalInformation_StandardId=NULL,@StandardAdditionalInformation_ClassId=NULL

EF似乎是在Sproc调用中注入2个参数:

@StandardAdditionalInformation_StandardId=NULL
@StandardAdditionalInformation_ClassId=NULL

这些在代码ANYWHERE中未引用,但它们是表格本身PK的值。

我有什么遗失的东西吗?我的意思是,如果不使用上下文构建器中定义的参数调用存储过程吗? 我的工作是将这两个参数添加到sproc并且工作正常,我认为这是一个非常肮脏的解决方案并且不希望它产生刺激!

1 个答案:

答案 0 :(得分:0)

在深入研究之后,我发现有问题的桌子有一个相同的PK和FK。 我删除了FK并修改了PK,使其更符合对表结构进行的一些更改,这些代码编写完成后,它可以正常工作。

我想我为&#34;解决方案提出了这个问题&#34;:

EF是否会生成强制存储过程参数的代码? IE浏览器。 EF是否认识到PK / FK的存在并且知道寻找多对多关系,所以它注入了它认为应该存在的参数?