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="data source=.\sqlexpress;initial catalog=WCFData;integrated security=True;pooling=False;multipleactiveresultsets=True;App=EntityFramework"" 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