0

我有一个函数导入到具有几个可选 SQL 参数的 SQL Proc。

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)?

4

1 回答 1

1

SSDL 和 CSDL 中的“Parameter”元素在创建“FunctionImport”时没有“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);
    }
}

...或添加不带最后一个参数的重载(上下文类是部分的)以排除歧义:

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

于 2012-05-28T07:21:29.473 回答