ASG*_*ASG 5 entity-framework entity-framework-6
我们有一个具有以下列的数据库表。
我们已经存储了处理Widget表上的更新/删除/插入的过程。
插入存储过程仅将WidgetName作为参数,例如
exec Widget_Insert @WidgetName='Foo Widget'
Run Code Online (Sandbox Code Playgroud)
然后,存储过程将WidgetCreatedOn WidgetLastUpdatedOn本身的日期放入。
Widget对象具有与表相同的属性,例如
是否可以告诉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)
我们正在做代码优先
虽然可能有一种方法可以手动更改 MapToStoredProcedures 配置来执行此操作,但我还没有发现它。话虽如此,有一种方法可以实现这一点,我认为这就是 EF 希望您做事的方式。
在模型映射中,指定 Identity 或 Computed 的 DatabaseGeneeratedOption 将阻止该属性发送到插入过程。
如果你仔细想想,这是有道理的。插入过程将从模型中获取尽可能多的信息来执行插入。但身份/计算属性是指数据库将为其提供数据的属性,因此它不会在模型中查找该数据。
这种方法需要注意一些事情。EF 将期望这些身份/计算字段从过程返回,因此您需要在插入后进行选择(在 sql server 中过滤 SCOPE_IDENTITY())。EF 还假设 Identity 字段不会返回为 null,因此即使您不打算稍后更新它们,也必须计算这些字段。
如果这些看起来都不令人满意,那么在 EF5 中执行此类操作的方法(并且更灵活一点)是重写上下文上的 SaveChanges 并在类型为 Widget 且为 EntityState.Added 时调用过程。或者,您可以抛出异常来强制开发人员自己调用过程,而不是使用 EF 的 DBSet Add 方法。
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |