Несмотря на это, у меня была совершенно другая проблема в .NET 4, которая вызвала то же исключение, с небольшим количеством полезной информации для ее диагностики.
Я обновил несколько таблиц в моем DBML. Возможно, я перезагрузил хранимую процедуру, но я не помню, чтобы это делалось.
У меня осталась следующая обертка sproc в файле designer.cs:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetSomeInformation", IsComposable=true)]
public IQueryable<GetSomeInformationResult> GetSomeInformation([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="BigInt")] System.Nullable<long> infoId)
{
return this.CreateMethodCallQuery<GetSomeInformationResult>(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), infoId);
}
CreateMethodCallQuery
предназначен для вызова табличных функций, а не хранимых процедур. Я озадачен тем, почему это изменило бы это. Я вернул его для использования ExecuteMethodCall
:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetSomeInformation")]
public ISingleResult<GetSomeInformationResult> GetSomeInformation([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="BigInt")] System.Nullable<long> infoId)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), infoId);
return ((ISingleResult<GetSomeInformationResult>)(result.ReturnValue));
}
И все хорошо. Очень странно.
ОБНОВЛЕНИЕ: Это, вероятно, было вызвано тем, что Visual Studio решила, что хранимая процедура была табличной функцией, когда она была добавлена в dbml. Я никогда не видел, чтобы это случилось раньше.
Флаг IsComposable, похоже, является единственным способом отличить хранимые процедуры от функций табличных значений. После того как я очистил флаг от узла Function в dbml, Visual Studio сгенерировал правильный код в файле конструктора.