实体框架MapToStoredProcedures-忽略参数

ASG*_*ASG 5 entity-framework entity-framework-6

我们有一个具有以下列的数据库表。

  • WidgetId(PK)
  • WidgetName
  • WidgetCreatedOn
  • WidgetLastUpdatedOn

我们已经存储了处理Widget表上的更新/删除/插入的过程。

插入存储过程仅将WidgetName作为参数,例如

  exec Widget_Insert @WidgetName='Foo Widget'
Run Code Online (Sandbox Code Playgroud)

然后,存储过程将WidgetCreatedOn WidgetLastUpdatedOn本身的日期放入。

Widget对象具有与表相同的属性,例如

  • WidgetId(键)
  • WidgetName
  • WidgetCreatedOn
  • WidgetLastUpdatedOn

是否可以告诉MapToStoredProcedures忽略特定属性,例如

        modelBuilder.Entity<Widget>()
            .MapToStoredProcedures(s =>
                s.Insert(i => i.HasName("Widget_Insert")
                      .Parameter(a => a.WidgetName, "WidgetName")
                      .Parameter(a => a.WidgetCreatedOn, **dont map it**)
                      .Parameter(a => a.WidgetLastUpdatedOn, **dont map it**)));
Run Code Online (Sandbox Code Playgroud)

我们正在做代码优先

Sha*_*umo 1

虽然可能有一种方法可以手动更改 MapToStoredProcedures 配置来执行此操作,但我还没有发现它。话虽如此,有一种方法可以实现这一点,我认为这就是 EF 希望您做事的方式。

在模型映射中,指定 Identity 或 Computed 的 DatabaseGeneeratedOption 将阻止该属性发送到插入过程。

如果你仔细想想,这是有道理的。插入过程将从模型中获取尽可能多的信息来执行插入。但身份/计算属性是指数据库将为其提供数据的属性,因此它不会在模型中查找该数据。

这种方法需要注意一些事情。EF 将期望这些身份/计算字段从过程返回,因此您需要在插入后进行选择(在 sql server 中过滤 SCOPE_IDENTITY())。EF 还假设 Identity 字段不会返回为 null,因此即使您不打算稍后更新它们,也必须计算这些字段。

如果这些看起来都不令人满意,那么在 EF5 中执行此类操作的方法(并且更灵活一点)是重写上下文上的 SaveChanges 并在类型为 Widget 且为 EntityState.Added 时调用过程。或者,您可以抛出异常来强制开发人员自己调用过程,而不是使用 EF 的 DBSet Add 方法。