EF 4.1+可以在Function Imports上生成可选参数吗?

时间:2012-05-28 06:21:09

标签: c# entity-framework entity-framework-4.1

我有一个函数导入到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)?

1 个答案:

答案 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模板。