Today I posted the final version of the Store Functions for Entity Framework Code First convention to NuGet. The instructions for downloading and installing the latest version of the package to your project are as described in my earlier blog post only you no longer have to select the “Include Pre-release” option when using UI or use the –Pre
option when installing the package with the Package Manager Console. If you installed a pre-release version of this package to your project and would like to update to this version just run the Update-Package EntityFramework.CodeFirstFunctions
command from the Package Manager Console.
What’s new in this version?
This new version contains only one addition comparing to the beta-2 version – the ability to specify the name of the store type for parameters. This is needed in cases where a CLR type can be mapped to more than one store type. In case of the Sql Server provider there is only one type like this – the xml
type. If you look at the Sql Server provider code (SqlProviderManifest.cs ln. 409) you will see that the store xml
type is mapped to the EDM String
type. This mapping is unambiguous when going from the store side. However the type inference in the Code First Functions convention works from the other end. First we have a CLR type (e.g. string
) which maps to the EDM String
type which is then used to find the corresponding store type by asking the provider. For the EDM String
type the Sql Server the provider will return (depending on the facets) one of the nchar
, nvarchar
, nvarchar(max)
, char
, varchar
, varchar(max)
types but it will never return the xml
type. This makes it basically impossible to use the xml
type when mapping store functions using the Code First Functions convention even though this is possible when using Database First EDMX based models.
Because, in general case, the type inference will not always work if multiple store types are mapped to one EDM Type I made it possible to specify the store type of a parameter using the new StoreType
property of the ParameterTypeAttribute
. For instance if you had a stored procedure called GetXmlInfo
that takes an xml
typed in/out parameter and returns some data (kind of a more advanced (spaghetti?) scenario but came from a real world application where the customer wanted to replace EDMX with Code First so they decided to use Code First Functions to map store functions and this was the only stored procedure they had problems with) you would use the following method to invoke this stored procedure:
[DbFunctionDetails(ResultColumnName = "Number")] [DbFunction("MyContext", "GetXmlInfo")] public virtual ObjectResult<int> GetXmlInfo( [ParameterType(typeof(string), StoreType = "xml")] ObjectParameter xml) { return ((IObjectContextAdapter)this).ObjectContext .ExecuteFunction("GetXmlInfo", xml); }
Because the parameter is in/out I had to use the ObjectParameter
to pass the value and to read the value returned by the stored procedure. Because I used ObjectParameter
I had to use the ParameterTypeAttribute
to tell the convention what is the Clr type of the parameter. Finally, I also used the StoreType
parameter which results in skipping asking the provider for the store type and using the type I passed.
That would be it. See my other blog posts here and here if you would like to see other supported scenarios. The code and issue tracking is on codeplex. Use and enjoy.
