代码改变世界

在Entity Framework中重用现有的数据库连接字符串

2012-09-18 11:31  yezhi  阅读(147)  评论(0)    收藏  举报

在Entity Framework中重用现有的数据库连接字符串

 

Entity Framework使用的连接字符串与ADO.NET是不同的,见下图:

相比于ADO.NET,Entity Framework的连接字符串不仅要存放metadata配置信息,还要存放完整的数据库连接字符串(上图中的"provider connection string"部分)。

这样的设计有两个不足之处:

1. 连接字符串配置复杂;

2. 无法重用现有的ADO.NET数据库连接字符串。

我觉得更合理的设计应该是将数据库连接字符串独立出来,并提供一个"provider connection string name"设置,在这个设置中可以指定“数据库连接字符串”的名称,效果见下图:

这样既简单,又能重用,多好!

YY之后,还是要回到现实,Entity Framework就是这个鸟样,现有的数据库连接字符串我就是想重用,那怎么办呢?

自己创建EntityConnection,并将之传递给ObjectContext的构造函数,代码如下:

复制代码
public CNBlogsObjectContext()
:
base(BuildConnection("CNBlogsDB"), "club_CNBlogsContainer")
{
}

static EntityConnection BuildConnection(string connectionStringName)
{
string connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
MetadataWorkspace workspace
=new MetadataWorkspace(newstring[] { "res://*/" },
new Assembly[] { Assembly.GetExecutingAssembly() });

SqlConnection sqlConnection
=new SqlConnection(connectionString);
returnnew EntityConnection(workspace, sqlConnection);
}
复制代码
 
 
public class DALBase
{
    public NWEntities NWContext { get; set; }
 
    public DALBase()
    {
        string providerString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
        string conn = GetEntityConnString(providerString);
        NWContext = new NWEntities(conn);
    }
 
    private string GetEntityConnString(string providerString)
    {
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        //Metadata属性的值,是从向导生成的Config粘贴过来的
        entityBuilder.Metadata = "res://*/NW.csdl|res://*/NW.ssdl|res://*/NW.msl";
        entityBuilder.ProviderConnectionString = providerString;
        entityBuilder.Provider = "System.Data.SqlClient";
 
        return entityBuilder.ToString();
    }
}