所以我对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并且工作正常,我认为这是一个非常肮脏的解决方案并且不希望它产生刺激!
答案 0 :(得分:0)
在深入研究之后,我发现有问题的桌子有一个相同的PK和FK。 我删除了FK并修改了PK,使其更符合对表结构进行的一些更改,这些代码编写完成后,它可以正常工作。
我想我为&#34;解决方案提出了这个问题&#34;:
EF是否会生成强制存储过程参数的代码? IE浏览器。 EF是否认识到PK / FK的存在并且知道寻找多对多关系,所以它注入了它认为应该存在的参数?