gpt4 book ai didi

entity-framework - Entity Framework MapToStoredProcedures - 忽略参数

转载 作者:行者123 更新时间:2023-12-04 08:57:30 24 4
gpt4 key购买 nike

我们有一个包含以下列的 db 表。

  • WidgetId (PK)
  • 小部件名称
  • WidgetCreatedOn
  • 小部件上次更新时间

  • 我们有处理小部件表上的更新/删除/插入的存储过程。

    插入存储过程需要 只是 WidgetName 作为参数,例如
      exec Widget_Insert @WidgetName='Foo Widget'

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

    Widget 对象具有与表格相同的属性,例如
  • WidgetId(键)
  • 小部件名称
  • WidgetCreatedOn
  • 小部件上次更新时间

  • 是否可以告诉 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**)));

    我们正在做代码优先

    最佳答案

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

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

    如果你仔细想想,这是有道理的。插入过程将从模型中获取尽可能多的信息来进行插入。但是 Identity/Computed 属性是您说 DB 将为其提供数据的属性,因此它不会查找该数据的模型。

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

    如果这些都不是很好吃,那么在 EF5 中做这种事情的方法(并且更灵活一点)是覆盖上下文上的 SaveChanges 并在类型为 Widget 且为 EntityState.Added 时调用 proc。或者你可以抛出一个异常来强制开发人员自己调用 proc,而不是使用 EF 的 DBSet Add 方法。

    关于entity-framework - Entity Framework MapToStoredProcedures - 忽略参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28218014/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com