Entity Framework MapToStoredProcedures - 忽略参数

6
我们有一个数据库表,包含以下列:
  • WidgetId(PK)
  • WidgetName
  • WidgetCreatedOn
  • WidgetLastUpdatedOn
我们有存储过程处理Widget表的更新/删除/插入操作。
插入存储过程仅需要WidgetName作为参数,例如:
  exec Widget_Insert @WidgetName='Foo Widget'

接下来,存储过程会为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**)));

我们正在使用 Code-First 进行开发。
2个回答

1
虽然可能有手动更改MapToStoredProcedures配置来实现这一点的方法,但我还没有发现它。话虽如此,有一种方法可以实现这一点,我认为这就是EF希望你做的事情。
在您的模型映射中,指定Identity或Computed的DatabaseGeneratedOption将防止该属性被发送到插入过程中。
如果您考虑一下,这是有道理的。插入过程将尽可能多地从模型中获取信息以执行插入操作。但是,Identity/Computed属性是您要求DB提供数据的属性,因此它不会寻找该数据的模型。
使用此方法需要注意几点。 EF期望那些Identity/Computed字段从过程中返回,因此您需要在插入后进行选择(在sql server中过滤SCOPE_IDENTITY())。 EF还假设Identity字段不会作为null返回,因此即使您不打算稍后更新它们,也必须将其设置为Computed。
如果以上方法都不可行,EF5 中实现此类操作的方法(更加灵活)是在上下文中重写 SaveChanges 方法,并在类型为 Widget 且 EntityState 为 Added 时调用存储过程。或者你可以抛出异常,强制开发人员自己调用存储过程而不是使用 EF 的 DBSet Add 方法。

我们已经尝试过了,但正如您所指出的,EF希望它们由存储过程返回,但我们只返回了范围标识符。最终暂时使用了EDMX。 - ASG

0

任何不需要传递给映射存储过程的属性(永远)都可以标记为计算属性。只需在属性定义前面添加属性[DatabaseGenerated(DatabaseGeneratedOption.Computed)]即可。存储过程在运行后必须返回一个包含所有“计算”值的结果集,否则将会出现乐观并发错误。使用Select * from where应该没问题。

如果您的类是自动生成的,则可以创建一个部分类来保护所有这些属性。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MyEfNamespace
{

    [MetadataType(typeof(MetaData))]
    public partial class Widget
    {
        public class MetaData
        {
            [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
            public System.DateTime WidgetCreatedOn;

            [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
            public System.DateTime WidgetLastUpdatedOn;

            ...
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接