我有一个函数导入到SQL Proc,它有几个可选的SQL参数。
CREATE PROC dbo.SomeProc ( @mandatoryField INT,
@optionalField1 INT = NULL,
@optionalField2 DATETIME = NULL ... )
但是,在导入之后,在我的DbContext上生成的方法上,EF会按如下方式创建签名:
public virtual ObjectResult<SomeType> SomeProc(int mandatoryField,
Nullable<int> optionalField1,
Nullable<DateTime> optionalField2, ...)
这意味着当我调用proc时,我需要提供显式空值,导致代码繁琐:
context.SomeProc(valueOfMandatoryField, null, null, ...)
有没有办法让EF在函数导入映射中使用C#可选参数(即使它意味着直接攻击SSDL / CSDL)?
答案 0 :(得分:1)
创建“FunctionImport”时,SSDL和CSDL中的“Parameter”元素没有“DefaultValue”属性。我认为,最简单的方法就是为生成的上下文类编写自定义扩展方法:
public static class MyContext_Extensions
{
public static ObjectResult<Nullable<global::System.Int32>> SomeProc(this MyContext context,
Nullable<global::System.Int32> mandatoryField,
Nullable<global::System.Int32> optionalField1 = null,
Nullable<global::System.DateTime> optionalField2 = null)
{
return context.SomeProc(mandatoryField, optionalField1, optionalField2);
}
}
...或者添加重载(上下文类是部分的)而不使用last参数来排除歧义:
public partial class MyContext
{
public ObjectResult<Nullable<global::System.Int32>> SomeProc(
Nullable<global::System.Int32> mandatoryField,
Nullable<global::System.Int32> optionalField1 = null)
{
return this.SomeProc(mandatoryField, optionalField1, null);
}
}
...或者如果您正在使用POCO实体生成器,则修改T4模板。