únicamente una puede operadores obtener llamar invocarse función funcion framework esta ejemplos desde datos consultas con como linq entity-framework sql-function

linq - una - Error 6046: no se puede generar el tipo de retorno de importación de la función de la función de almacenamiento



obtener datos con entity framework (3)

Tengo una función de valor escalar en mi base de datos SQL.

Recibo este error al importar esta función en el modelo de Entity Framework:

Error 6046: Unable to generate function import return type of the store function ''GetContentByIdAndCul''. The store function will be ignored and the function import will not be generated. ../EntityModels.edmx

mi función tsql es:

ALTER FUNCTION [FRM].[GetContentByIdAndCul] (@Id int,@Culture nvarchar(5)) RETURNS nvarchar(max) AS BEGIN declare @Result nvarchar(max) if @Id is not null set @Result=''This Content not defined in this Language'' select @Result=Value from CUL.Contents WHERE ID=@Id AND (CUL.Contents.Culture = LOWER(@Culture) OR CUL.Contents.Culture = LOWER(SUBSTRING(@Culture,1,2))) return @Result END


Cree una clase parcial para YOURMODEL.Context.cs: public partial class YOUREntities : DbContext

[DbFunction("YOURModel.Store", "YOURSCALARFUNCTION")] public string YOURSCALARFUNCTION(string PARAMETER) { List<ObjectParameter> parameters = new List<ObjectParameter>(3); parameters.Add(new ObjectParameter("PARAMETER", PARAMETER)); var lObjectContext = ((IObjectContextAdapter)this).ObjectContext; var output = lObjectContext. CreateQuery<string>("YOURMODEL.Store.YOURSCALARFUNCTION(@PARAMETER)", parameters.ToArray()) .Execute(MergeOption.NoTracking) .FirstOrDefault(); return output; }

Asegúrese de tener su función agregada a YOURMODEL.EDMX, debe ser algo como esto:

<Function Name="YOURSCALARFUNCTION" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" ReturnType="nvarchar(max)"> <Parameter Name="PARAMETER" Type="nvarchar(max)" Mode="In" /> </Function>


Hasta hoy, el marco de entidad no soporta la generación de llamadas para funciones escalares. Pero, puede resolver el problema escribiendo un método personalizado como este dentro de su clase DbContext:

public partial class YouDbContext { [DbFunction("YouDbContext.Store", "YourScalarFunction")] public string YourScalarFunction(string parameter) { var lObjectContext = ((IObjectContextAdapter)this).ObjectContext; return lObjectContext. CreateQuery<string >( "YouDbContext.Store.YourScalarFunction", new ObjectParameter("parameterName", parameter)). Execute(MergeOption.NoTracking). FirstOrDefault(); } }


Las respuestas anteriores muestran la buena manera de resolver el problema, pero ninguna funciona en la vida real.

Aquí hay una solución probada con Entity Framework 6 que funciona para mí. Así que debería funcionar para usted.

Importe su función escalar

Importe su función de valor escalar [FRM].[GetContentByIdAndCul] en su modelo de Entity Framework. Crea automáticamente la entrada correspondiente en el modelo de almacenamiento de su archivo EntityModels.edmx :

<Function Name="GetContentByIdAndCul" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="FRM" ReturnType="nvarchar(max)"> <Parameter Name="Id" Type="int" Mode="In" /> <Parameter Name="Culture" Type="nvarchar(5)" Mode="In" /> </Function>

Agregue código para ajustar la llamada a su función de valor escalar

Cree un nuevo archivo fuente y agregue código a la clase DbContext generada automáticamente (diga que su nombre es MyEntities ) usando un mecanismo de clase parcial ( https://msdn.microsoft.com/en-us/library/wa80x488%28v=vs.120%29.aspx )

public partial class MyEntities { [DbFunction("EntityModels.Store", "GetContentByIdAndCul")] public string GetContentByIdAndCul(int id, string culture) { var objectContext = ((IObjectContextAdapter)this).ObjectContext; var parameters = new List<ObjectParameter>(); parameters.Add(new ObjectParameter("Id", id)); parameters.Add(new ObjectParameter("Culture", culture)); return objectContext.CreateQuery<string>("EntityModels.Store.GetContentByIdAndCul(@Id, @Culture)", parameters.ToArray()) .Execute(MergeOption.NoTracking) .FirstOrDefault(); } }

Usa tu función escalar

Codigo del cliente :

using (var context = new MyEntities()) { int id = 1; string culture = "fr-FR"; string result = null; result = context.GetContentByIdAndCul(id, culture); }