代码改变世界

Convert EntityFrameWork which called Entity connection string to Sql conncion string

2011-10-30 09:29  barbarossia  阅读(486)  评论(0编辑  收藏  举报

When use the EntityFrameWork, it will be automated generate the Entity Connection string which like :

<add name="WCFDataEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\sqlexpress;initial catalog=WCFData;integrated security=True;pooling=False;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

But the sql conntion string which like :

<add name="StoreEntities" connectionString="Data Source=.;Initial Catalog=Store;Integrated Security=false;User Id=sa;Password=User@123;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

is common used.

 

The different is provider the entity’s “System.Data.EntityClient”, the sql’s “System.Data.SqlClient”. And the entity connection string is add which called metadata as "metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;.

So I want to convert the entityframework connection string to the normal sql conntcion string, and make the entityframework model do it self.

 

So I change the template file which called Model.Context.tt

the original is:

 

using System;
using System.Data.Objects;
using System.Data.EntityClient;

<#
if (!String.IsNullOrEmpty(namespaceName))
{
#>
namespace <#=code.EscapeNamespace(namespaceName)#>
{
<#
    PushIndent(CodeRegion.GetIndent(1));
}
#>
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
{
    public const string ConnectionString = "name=<#=container.Name#>";
    public const string ContainerName = "<#=container.Name#>";

    #region Constructors

    public <#=code.Escape(container)#>()
        : base(ConnectionString, ContainerName)
    {
<#
        WriteLazyLoadingEnabled(container);
#>
    }

    public <#=code.Escape(container)#>(string connectionString)
        : base(connectionString, ContainerName)
    {
<#
        WriteLazyLoadingEnabled(container);
#>
    }

    public <#=code.Escape(container)#>(EntityConnection connection)
        : base(connection, ContainerName)
    {
<#
        WriteLazyLoadingEnabled(container);
#>
    }

    #endregion

 

And the modify after is:

using System;
using System.Configuration;
using System.Data.Objects;
using System.Data.EntityClient;

<#
if (!String.IsNullOrEmpty(namespaceName))
{
#>
namespace <#=code.EscapeNamespace(namespaceName)#>
{
<#
    PushIndent(CodeRegion.GetIndent(1));
}
#>
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : ObjectContext
{
    private const string containerName = "<#=container.Name#>";

    private static EntityConnection connection
    {
        get
        {
            // Initialize the EntityConnectionStringBuilder.
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();

            //Set the provider name.
            entityBuilder.Provider = "System.Data.SqlClient";

            // Set the provider-specific connection string.
            entityBuilder.ProviderConnectionString = ConfigurationManager.ConnectionStrings[containerName].ConnectionString;

            // Set the Metadata location.
            entityBuilder.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", "KeyStoreModel");

            return new EntityConnection(entityBuilder.ToString());
        }
    }

    #region Constructors

    public <#=code.Escape(container)#>()
        : base(connection, containerName)
    {
    }

    #endregion

 

 

I add the type of EntityConnection,which called connection, it is sovled the entity connection string to sql connection string.

So after run the template, the code look like as :

using System;
using System.Configuration;
using System.Data.Objects;
using System.Data.EntityClient;

namespace Data.DataAccess
{
    public partial class StoreEntities : ObjectContext
    {
        private const string containerName = "StoreEntities";
    
        private static EntityConnection connection 
        {
            get
            {
                // Initialize the EntityConnectionStringBuilder.
                EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
    
                //Set the provider name.
                entityBuilder.Provider = "System.Data.SqlClient";
    
                // Set the provider-specific connection string.
                entityBuilder.ProviderConnectionString = ConfigurationManager.ConnectionStrings[containerName].ConnectionString;
    
                // Set the Metadata location.
                entityBuilder.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", "StoreModel");
    
                return new EntityConnection(entityBuilder.ToString());
            }
        }
    
        #region Constructors
    
        public StoreEntities()
            : base(connection, containerName)
        {
        }
    
        #endregion