<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Jaroslaw Kowalski : EFSampleProvider</title><link>http://blogs.msdn.com/jkowalski/archive/tags/EFSampleProvider/default.aspx</link><description>Tags: EFSampleProvider</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Using EF Oracle Sample Provider with EDM Designer</title><link>http://blogs.msdn.com/jkowalski/archive/2008/10/24/using-ef-oracle-sample-provider-with-edm-designer.aspx</link><pubDate>Fri, 24 Oct 2008 20:24:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9015021</guid><dc:creator>jkowalski</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/jkowalski/comments/9015021.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jkowalski/commentrss.aspx?PostID=9015021</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jkowalski/rsscomments.aspx?PostID=9015021</wfw:comment><description>&lt;p&gt;Many people are asking if it is possible to use &lt;a href="http://code.msdn.microsoft.com/EFOracleProvider"&gt;EFOracleProvider&lt;/a&gt; with EDM Designer in Visual Studio 2008 SP1. The answer is yes, but because the sample doesn't include a DDEX provider required for VS integration, there are certain steps that have to be run manually. &lt;/p&gt;  &lt;p&gt;I've compiled a step-by-step guide for those interested in trying this out (this assumes NorthwindEF sample database installed according to instructions included with the sample, but it should be straightforward to adjust it to your own setup)&lt;/p&gt;  &lt;h2&gt;PART 1 : INSTALLING ORACLE SAMPLE PROVIDER&lt;/h2&gt;  &lt;p&gt;1. Download and unzip EFOracleSampleProvider.zip from &lt;a href="http://code.msdn.com/EFOracleProvider"&gt;http://code.msdn.com/EFOracleProvider&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2. Follow instructions in the README.txt to set up a sample database. &lt;/p&gt;  &lt;p&gt;3. Open elevated Visual Studio instance. Build the sample project. &lt;/p&gt;  &lt;p&gt;4. Open elevated command prompt and open machine.config using notepad:&amp;#160; &lt;br /&gt;&lt;strong&gt;notepad %WINDIR%\Microsoft.NET\Framework\v2.0.50727\config\machine.config&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;5. Find &amp;lt;DbProviderFactories&amp;gt; section and add EFOracleProvider entry:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EF Oracle Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EFOracleProvider&amp;quot;&lt;/span&gt; 
     &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EF Provider for Oracle testing&amp;quot;&lt;/span&gt; 
     &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EFOracleProvider.EFOracleProviderFactory, EFOracleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;6. The completed system.data section has to look similar to this: &lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.data&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DbProviderFactories&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Odbc Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.Odbc&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.Net Framework Data Provider for Odbc&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OleDb Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.OleDb&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.Net Framework Data Provider for OleDb&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;OracleClient Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.OracleClient&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.Net Framework Data Provider for Oracle&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SqlClient Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.SqlClient&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.Net Framework Data Provider for SqlServer&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;strong&gt;&lt;em&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EF Oracle Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EFOracleProvider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EF Provider for Oracle testing&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;EFOracleProvider.EFOracleProviderFactory, EFOracleProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;/em&gt;&lt;/strong&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Microsoft SQL Server Compact Data Provider&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;invariant&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.SqlServerCe.3.5&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.NET Framework Data Provider for Microsoft SQL Server Compact&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DbProviderFactories&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.data&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;h2&gt;PART 2: GENERATING MODEL FROM ORACLE DATABASE&lt;/h2&gt;

&lt;p&gt;7. Create a new project in VS. For simplicity let's create a console application&lt;/p&gt;

&lt;p&gt;8. Open elevated command prompt. Enter the directory that contains the newly created project and run the following command:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;%WINDIR%\Microsoft.NET\Framework\v3.5\edmgen.exe /provider:EFOracleProvider /mode:fullgeneration &lt;br /&gt;      /connectionstring:&lt;span class="str"&gt;&amp;quot;data source=XE;user id=edmuser;password=123456&amp;quot;&lt;/span&gt; /project:NorthwindEFModel&lt;br /&gt;&lt;/pre&gt;

&lt;p&gt;The output should be:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;Microsoft (R) EdmGen version 3.5.0.0
Copyright (C) 2008 Microsoft Corporation. All rights reserved.

Loading database information...
warning 6005: The data type &lt;span class="str"&gt;'timestamp(9)'&lt;/span&gt; is not supported, the column &lt;span class="str"&gt;'OrderDate'&lt;/span&gt; &lt;span class="kwrd"&gt;in&lt;/span&gt; table &lt;span class="str"&gt;'dbo.Orders'&lt;/span&gt; was excluded.
warning 6005: The data type &lt;span class="str"&gt;'timestamp(3)'&lt;/span&gt; is not supported, the column &lt;span class="str"&gt;'RequiredDate'&lt;/span&gt; &lt;span class="kwrd"&gt;in&lt;/span&gt; table &lt;span class="str"&gt;'dbo.Orders'&lt;/span&gt; was excluded.
Writing ssdl file...
Creating conceptual layer from storage layer...
Writing msl file...
Writing csdl file...
Writing object layer file...
Writing views file...

Generation Complete -- 0 errors, 2 warnings&lt;/pre&gt;

&lt;p&gt;9. This will create a bunch of NorthwindEFModel.* files for you.&lt;/p&gt;

&lt;p&gt;10. Open Northwind.ssdl file in a text editor and replace all instances of Schema=&amp;quot;dbo&amp;quot; with empty string (this is needed because tables in the sample Oracle database don't use a schema)&lt;/p&gt;

&lt;p&gt;11. In order to use generated model in the EF Ddesigner, we have to create NorthwindEFModel.edmx file. This can be done manually (just copy/paste contents of individual files into an empty EDMX as indicated by the comments) or by using &lt;a href="http://code.msdn.com/EdmGen2"&gt;EdmGen2 tool from Code Gallery&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;C:\Path\To\EdmGen2.exe /toedmx NorthwindEFModel.csdl NorthwindEFModel.ssdl NorthwindEFModel.msl&lt;/pre&gt;

&lt;p&gt;12. This will create NorthwindEFModel.edmx, which we can add to the project in VS. &lt;/p&gt;

&lt;p&gt;13. At this point you can now delete the following files generated by EdmGen.exe, which won't be necessary:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;NorthwindEFModel.csdl &lt;/li&gt;

  &lt;li&gt;NorthwindEFModel.ssdl &lt;/li&gt;

  &lt;li&gt;NorthwindEFModel.msl &lt;/li&gt;

  &lt;li&gt;NorthwindEFModel.ObjectLayer.cs &lt;/li&gt;

  &lt;li&gt;NorthwindEFModel.Views.cs &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;PART 3: TESTING GENERATED MODEL&lt;/h2&gt;

&lt;p&gt;14. The only remaining thing to do is to add App.config file with connection string for our Oracle database:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;connectionStrings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;NorthwindEFModelContext&amp;quot;&lt;/span&gt; 
         &lt;span class="attr"&gt;connectionString&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;provider=EFOracleProvider;
                           metadata=res://*/NorthwindEFModel.csdl|res://*/NorthwindEFModel.ssdl|res://*/NorthwindEFModel.msl;
                           Provider Connection String='data source=XE;user id=edmuser;password=123456'&amp;quot;&lt;/span&gt; 
         &lt;span class="attr"&gt;providerName&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;System.Data.EntityClient&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;connectionStrings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;15. We can now try out our model by running a sample LINQ to Entities query:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (NorthwindEFModelContext context = &lt;span class="kwrd"&gt;new&lt;/span&gt; NorthwindEFModelContext())
{
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var c &lt;span class="kwrd"&gt;in&lt;/span&gt; context.Customers.Where(c=&amp;gt;c.City == &lt;span class="str"&gt;&amp;quot;Seattle&amp;quot;&lt;/span&gt;))
    {
        Console.WriteLine(c.CompanyName);
    }
}&lt;/pre&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9015021" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jkowalski/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/jkowalski/archive/tags/EFSampleProvider/default.aspx">EFSampleProvider</category><category domain="http://blogs.msdn.com/jkowalski/archive/tags/EFOracleProvider/default.aspx">EFOracleProvider</category></item><item><title>Sample Entity Framework Provider for Oracle</title><link>http://blogs.msdn.com/jkowalski/archive/2008/06/23/sample-entity-framework-provider-for-oracle.aspx</link><pubDate>Tue, 24 Jun 2008 01:54:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8644126</guid><dc:creator>jkowalski</dc:creator><slash:comments>8</slash:comments><comments>http://blogs.msdn.com/jkowalski/comments/8644126.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jkowalski/commentrss.aspx?PostID=8644126</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jkowalski/rsscomments.aspx?PostID=8644126</wfw:comment><description>&lt;p&gt;I wanted to let you know that we have just released Sample Entity Framework Provider for Oracle on MSDN Code Gallery.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.com/EFOracleProvider"&gt;http://code.msdn.com/EFOracleProvider&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The provider is implemented using essentially the same technique as &lt;a href="http://code.msdn.microsoft.com/EFSampleProvider" target="_blank"&gt;EFSampleProvider&lt;/a&gt;, but targets System.Data.OracleClient instead of System.Data.SqlClient. The provider is compatible with Visual Studio SP1 Beta and the code is released under Microsoft Public License (Ms-PL).&lt;/p&gt;  &lt;p&gt;There are three notable features of this provider:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Non-default type mappings&lt;/strong&gt;. In EFOracleProviderManifest we are supporting non-default type mappings:       &lt;ul&gt;       &lt;li&gt;EFOracle.number(1,0) maps to Edm.Boolean &lt;/li&gt;        &lt;li&gt;EFOracle.number(5,0) maps to Edm.Int16 &lt;/li&gt;        &lt;li&gt;EFOracle.number(11,0) maps to Edm.Int32 &lt;/li&gt;        &lt;li&gt;EFOracle.raw(16) maps to Edm.Guid &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here's the interesting piece of code taken from EFOracleProviderManifest.GetEdmType() that does it. It looks at facets attached to the given store type and translates certain combinations of them into mentioned EDM types.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;number&amp;quot;&lt;/span&gt;:
    {
        &lt;span class="kwrd"&gt;byte&lt;/span&gt; precision;
        &lt;span class="kwrd"&gt;byte&lt;/span&gt; scale;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (MetadataHelpers.TryGetPrecision(storeType, &lt;span class="kwrd"&gt;out&lt;/span&gt; precision) &amp;amp;&amp;amp;
            MetadataHelpers.TryGetScale(storeType, &lt;span class="kwrd"&gt;out&lt;/span&gt; scale))
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (precision == 1 &amp;amp;&amp;amp; scale == 0)
                &lt;span class="kwrd"&gt;return&lt;/span&gt; TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Boolean));

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (precision == 5 &amp;amp;&amp;amp; scale == 0)
                &lt;span class="kwrd"&gt;return&lt;/span&gt; TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int16));

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (precision == 11 &amp;amp;&amp;amp; scale == 0)
                &lt;span class="kwrd"&gt;return&lt;/span&gt; TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32));

            &lt;span class="kwrd"&gt;return&lt;/span&gt; TypeUsage.CreateDecimalTypeUsage(edmPrimitiveType, precision, scale);
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; TypeUsage.CreateDecimalTypeUsage(edmPrimitiveType);
        }
    }&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Data type coercion in the data reader&lt;/strong&gt;. Data provider analyzes Canonical Query Tree (CQT) and remembers expected CLR types for each result column ordinal. Whenever this data type is different from the data returned by wrapped OracleDataReader, the value is coerced using Convert.ChangeType(). &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code below extracts ExpectedColumnTypes from the canonical query tree:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// Set expected column types for DbQueryCommandTree&lt;/span&gt;
DbQueryCommandTree queryTree = commandTree &lt;span class="kwrd"&gt;as&lt;/span&gt; DbQueryCommandTree;
&lt;span class="kwrd"&gt;if&lt;/span&gt; (queryTree != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
{
    DbProjectExpression projectExpression = queryTree.Query &lt;span class="kwrd"&gt;as&lt;/span&gt; DbProjectExpression;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (projectExpression != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        EdmType resultsType = projectExpression.Projection.ResultType.EdmType;

        StructuralType resultsAsStructuralType = resultsType &lt;span class="kwrd"&gt;as&lt;/span&gt; StructuralType;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (resultsAsStructuralType != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            command.ExpectedColumnTypes = &lt;span class="kwrd"&gt;new&lt;/span&gt; PrimitiveType[resultsAsStructuralType.Members.Count];

            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; ordinal = 0; ordinal &amp;lt; resultsAsStructuralType.Members.Count; ordinal++)
            {
                EdmMember member = resultsAsStructuralType.Members[ordinal];
                PrimitiveType primitiveType = member.TypeUsage.EdmType &lt;span class="kwrd"&gt;as&lt;/span&gt; PrimitiveType;
                command.ExpectedColumnTypes[ordinal] = primitiveType;
            }
        }
    }
}

&lt;span class="rem"&gt;// Set expected column types for DbFunctionCommandTree&lt;/span&gt;
DbFunctionCommandTree functionTree = commandTree &lt;span class="kwrd"&gt;as&lt;/span&gt; DbFunctionCommandTree;
&lt;span class="kwrd"&gt;if&lt;/span&gt; (functionTree != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (functionTree.ResultType != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        Debug.Assert(MetadataHelpers.IsCollectionType(functionTree.ResultType.EdmType),
            &lt;span class="str"&gt;&amp;quot;Result type of a function is expected to be a collection of RowType or PrimitiveType&amp;quot;&lt;/span&gt;);

        EdmType elementType = MetadataHelpers.GetElementTypeUsage(functionTree.ResultType).EdmType;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (MetadataHelpers.IsRowType(elementType))
        {
            ReadOnlyMetadataCollection&amp;lt;EdmMember&amp;gt; members = ((RowType)elementType).Members;
            command.ExpectedColumnTypes = &lt;span class="kwrd"&gt;new&lt;/span&gt; PrimitiveType[members.Count];

            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; ordinal = 0; ordinal &amp;lt; members.Count; ordinal++)
            {
                EdmMember member = members[ordinal];
                PrimitiveType primitiveType = (PrimitiveType)member.TypeUsage.EdmType;
                command.ExpectedColumnTypes[ordinal] = primitiveType;
            }

        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (MetadataHelpers.IsPrimitiveType(elementType))
        {
            command.ExpectedColumnTypes = &lt;span class="kwrd"&gt;new&lt;/span&gt; PrimitiveType[1];
            command.ExpectedColumnTypes[0] = (PrimitiveType)elementType;
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            Debug.Fail(&lt;span class="str"&gt;&amp;quot;Result type of a function is expected to be a collection of RowType or PrimitiveType&amp;quot;&lt;/span&gt;);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;The provider needs to store this information in the DbCommand and pass down to DbDataReader. In the reader implementation, actual data coercion is done in the following manner:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; EFOracleDataReader : DbDataReader &lt;br /&gt;{
&lt;span class="kwrd"&gt;    private&lt;/span&gt; PrimitiveType[] _expectedColumnTypes;

&lt;span class="rem"&gt;    // ...&lt;/span&gt;

&lt;span class="kwrd"&gt;    public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; DateTime GetDateTime(&lt;span class="kwrd"&gt;int&lt;/span&gt; ordinal)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; (DateTime)GetValue(ordinal);
    }

&lt;span class="kwrd"&gt;    public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;decimal&lt;/span&gt; GetDecimal(&lt;span class="kwrd"&gt;int&lt;/span&gt; ordinal)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; (&lt;span class="kwrd"&gt;decimal&lt;/span&gt;)GetValue(ordinal);
    }

&lt;span class="kwrd"&gt;    public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; GetValue(&lt;span class="kwrd"&gt;int&lt;/span&gt; ordinal)
    {
        &lt;span class="kwrd"&gt;object&lt;/span&gt; rawValue = _oracleReader.GetValue(ordinal);

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_expectedColumnTypes != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!(rawValue &lt;span class="kwrd"&gt;is&lt;/span&gt; DBNull) &amp;amp;&amp;amp; rawValue.GetType()
                != _expectedColumnTypes[ordinal].ClrEquivalentType)
            {
                rawValue = ChangeType(rawValue, _expectedColumnTypes[ordinal].ClrEquivalentType);
            }
        }
        &lt;span class="kwrd"&gt;return&lt;/span&gt; rawValue;
    }

&lt;span class="kwrd"&gt;    private&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; ChangeType(&lt;span class="kwrd"&gt;object&lt;/span&gt; sourceValue, Type targetType)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (sourceValue &lt;span class="kwrd"&gt;is&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] &amp;amp;&amp;amp; targetType == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Guid))
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Guid((&lt;span class="kwrd"&gt;byte&lt;/span&gt;[])sourceValue);
        }
   
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (sourceValue &lt;span class="kwrd"&gt;is&lt;/span&gt; DateTime &amp;amp;&amp;amp; targetType == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DateTimeOffset))
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTimeOffset((DateTime)sourceValue);
        }

        &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ChangeType(sourceValue, targetType, CultureInfo.InvariantCulture);
    }

&lt;span class="rem"&gt;    // ...&lt;/span&gt;
}&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Canonical Functions&lt;/strong&gt;. Most Canonical Functions required by Entity Framework have been implemented using Oracle's built-in functions. In some cases it required some query rewriting, such as when handling Right() canonical function which has no direct Oracle translation and SUBSTR() must be used instead. &lt;/li&gt;
&lt;/ul&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; ISqlFragment HandleCanonicalFunctionRight(SqlGenerator sqlgen, DbFunctionExpression e)
{
    SqlBuilder result = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlBuilder();
    result.Append(&lt;span class="str"&gt;&amp;quot;(CASE WHEN LENGTH(&amp;quot;&lt;/span&gt;);
    result.Append(e.Arguments[0].Accept(sqlgen));
    result.Append(&lt;span class="str"&gt;&amp;quot;) &amp;gt;= (&amp;quot;&lt;/span&gt;);
    result.Append(e.Arguments[1].Accept(sqlgen));
    result.Append(&lt;span class="str"&gt;&amp;quot;) THEN &amp;quot;&lt;/span&gt;);
    result.Append(&lt;span class="str"&gt;&amp;quot;SUBSTR (&amp;quot;&lt;/span&gt;);
    result.Append(e.Arguments[0].Accept(sqlgen));
    result.Append(&lt;span class="str"&gt;&amp;quot;,-(&amp;quot;&lt;/span&gt;);
    result.Append(e.Arguments[1].Accept(sqlgen));
    result.Append(&lt;span class="str"&gt;&amp;quot;),&amp;quot;&lt;/span&gt;);
    result.Append(e.Arguments[1].Accept(sqlgen));
    result.Append(&lt;span class="str"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;);
    result.Append(&lt;span class="str"&gt;&amp;quot; ELSE &amp;quot;&lt;/span&gt;);
    result.Append(e.Arguments[0].Accept(sqlgen));
    result.Append(&lt;span class="str"&gt;&amp;quot; END)&amp;quot;&lt;/span&gt;);
    &lt;span class="kwrd"&gt;return&lt;/span&gt; result;
}&lt;/pre&gt;

&lt;p&gt;Let me know if you have any questions about the EFOracleProvider release and EF provider interface in general.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8644126" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jkowalski/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/jkowalski/archive/tags/EFSampleProvider/default.aspx">EFSampleProvider</category></item><item><title>Entity Framework Sample Provider for Visual Studio 2008 SP1 Beta is Online</title><link>http://blogs.msdn.com/jkowalski/archive/2008/06/02/entity-framework-sample-provider-for-visual-studio-2008-sp1-beta-is-online.aspx</link><pubDate>Tue, 03 Jun 2008 08:48:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8571021</guid><dc:creator>jkowalski</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jkowalski/comments/8571021.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jkowalski/commentrss.aspx?PostID=8571021</wfw:commentRss><wfw:comment>http://blogs.msdn.com/jkowalski/rsscomments.aspx?PostID=8571021</wfw:comment><description>&lt;P&gt;We have just published an updated&amp;nbsp;Sample ADO.NET Provider for Entity Framework.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Changes in the provider APIs since Beta3 release:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;removed DbProviderServices.GetProviderManifest(DbConnection)&lt;/LI&gt;
&lt;LI&gt;added DbProviderServices.GetProviderManifestToken(DbConnection)&lt;/LI&gt;
&lt;LI&gt;completely redesigned CSDL/SSDL/MSL for SchemaInformation&lt;/LI&gt;
&lt;LI&gt;changed the format of the provider manifest XML:&lt;BR&gt;&amp;nbsp;- DefaultValue vs Default&lt;BR&gt;&amp;nbsp;- removed facets from functions&lt;/LI&gt;
&lt;LI&gt;added DbProviderManifest.Token/DbProviderManifest.Provider properties&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Provider writers can get the source code from MSDN Code Gallery: &lt;U&gt;&lt;FONT color=#800080&gt;&lt;A href="http://code.msdn.microsoft.com/EFSampleProvider"&gt;http://code.msdn.microsoft.com/EFSampleProvider&lt;/A&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8571021" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jkowalski/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/jkowalski/archive/tags/EFSampleProvider/default.aspx">EFSampleProvider</category></item></channel></rss>