【问题标题】:EF (6.1) Code-First stored procedure issueEF(6.1)代码优先存储过程问题
【发布时间】:2014-05-12 14:20:46
【问题描述】:

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

在我的上下文类中,我调用了为插入、删除和更新事件连接的存储过程,这是有问题的:

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().Add(值); //其中 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 似乎将 2 个参数注入到 Sproc 调用中:

@StandardAdditionalInformation_StandardId=NULL
@StandardAdditionalInformation_ClassId=NULL

这些在任何地方的代码中都没有引用,但它们是表本身的 PK 值。

我有什么遗漏吗?我的意思是,不应该只使用上下文构建器中定义的参数调用存储的过程吗? 我的解决方法是将这两个参数添加到存储过程中,效果很好,我只是认为这是一个非常肮脏的解决方案,不希望它受到刺激!

【问题讨论】:

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


    【解决方案1】:

    在深入研究之后,我发现有问题的表有一个相同的 PK 和 FK。 我删除了 FK 并修改了 PK,使其更符合在编写此代码后对表结构所做的一些更改,并且成功了。

    我想我为“解决方案”提出这个问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多