对于标量函数 (UDF) 而不是 SP,这将是微不足道的。但是,它应该很容易工作 - 尽管如果 SP 很复杂(即 FMT_ONLY 无法 100% 检查它),那么您可能需要“帮助”它...
这是我从返回整数的简化 SP 生成的一些 dbml;您可以通过“使用... xml 编辑器打开”来编辑 dbml:
<Function Name="dbo.foo" Method="foo">
<Parameter Name="inc" Type="System.Int32" DbType="Int" />
<Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
<Return Type="System.Int32" />
</Function>
(请注意,您显然需要调整名称和数据类型)。
这里是生成的 C#:
[Function(Name="dbo.foo")]
public int foo([Parameter(DbType="Int")] System.Nullable<int> inc, [Parameter(DbType="VarChar(20)")] string dataset)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
return ((int)(result.ReturnValue));
}
如果您当前的 SP 使用 SELECT(而不是 RETURN),则 DBML 将需要反映这一点。您可以通过隐藏实现细节并在部分类中提供公共包装器来解决此问题;例如:
<Function Name="dbo.foo" Method="FooPrivate" AccessModifier="Private">
<Parameter Name="inc" Type="System.Int32" DbType="Int" />
<Parameter Name="dataset" Type="System.String" DbType="VarChar(20)" />
<ElementType Name="fooResult" AccessModifier="Internal">
<Column Name="value" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" />
</ElementType>
</Function>
上面描述了一个SP,它返回一个单列的单表;但我已将 SP 设为数据上下文的“私有”,并将结果类型设为程序集的“内部”(隐藏它):
[Function(Name="dbo.foo")]
private ISingleResult<fooResult> FooPrivate(
[Parameter(DbType="Int")] System.Nullable<int> inc,
[Parameter(DbType="VarChar(20)")] string dataset)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), inc, dataset);
return ((ISingleResult<fooResult>)(result.ReturnValue));
}
现在在我自己的类文件中我可以在正确的命名空间中添加一个新的部分类(一个新的 .cs 文件),这样可以更方便地公开该方法:
namespace MyNamespace {
partial class MyDataContext
{
public int Foo(int? inc, string dataSet)
{
return FooPrivate(inc, dataSet).Single().value;
}
}
}
(命名空间和上下文名称需要与实际的数据上下文相同)。这添加了一个公共方法,该方法向调用者隐藏蹩脚的细节。
不要直接编辑designer.cs文件;您的更改将丢失。只编辑 dbml 或部分类。