創建EF模型后,自動生成的connectionString如下:
<add name="TravelPPEntities" connectionString="metadata=res://*/TravelPP.csdl|res://*/TravelPP.ssdl|res://*/TravelPP.msl;provider=System.Data.SqlClient;provider connection string="data source=192.168.10.27;initial catalog=TravelPP1;persist security info=True;user id=sa;password=En7Jw5Xh;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
其中包括db連接串,用戶名尤其密碼明文顯示不安全, 同時,對於像olap這樣的項目,太多的connectionString,不利於統一管理db連接串。
可以通過如下方法分離db連接串(有了分離的方法, 利用加密手段來做安全控制就有招兒了):
首先,把上面connectionString里的provider connection string去掉吧, 然后在connectionStrings節點增加:
<connectionStrings> <add name="TravelPPEntities" connectionString="metadata=res://*/TravelPP.csdl|res://*/TravelPP.ssdl|res://*/TravelPP.msl;provider=System.Data.SqlClient;" providerName="System.Data.EntityClient" /> <add name="TravelPPEntitiesConnection" connectionString="data source=192.168.10.27;initial catalog=TravelPP1;user id=sa;password=En7Jw5Xh;persist security info=True;MultipleActiveResultSets=True;App=EntityFramework"/> </connectionStrings>
然后,在用你的上下文時,按如下方式:
TravelPPEntities dbEntities = new TravelPPEntities(); dbEntities.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["TravelPPEntitiesConnection"].ConnectionString;
然后,就可以做你的crud邏輯了。
需思考:
按照上面的方式,在bll層用DbContext派生類時,每聲明一個DbContext派生類對象,還要帶上指定ConnectionString的代碼 , 這在bll層比較不好。
如下,在構造器里這樣初始化ConnectionString可以達到封裝的效果,但是,“此代碼是根據模板生成的,如果重新生成代碼,則將覆蓋對此文件的手動更改。”
//------------------------------------------------------------------------------ // <auto-generated> // 此代碼是根據模板生成的。 // // 手動更改此文件可能會導致應用程序中發生異常行為。 // 如果重新生成代碼,則將覆蓋對此文件的手動更改。 // </auto-generated> //------------------------------------------------------------------------------ namespace EF { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class TravelPPEntities : DbContext { public TravelPPEntities() : base("name=TravelPPEntities") { this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["TravelPPEntitiesConnection"].ConnectionString; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public DbSet<T_Audit_EntContacts> T_Audit_EntContacts { get; set; } public DbSet<T_Info_Enterprises> T_Info_Enterprises { get; set; } public DbSet<T_Info_Passengers> T_Info_Passengers { get; set; } public DbSet<T_User_Account> T_User_Account { get; set; } public DbSet<T_User_Role> T_User_Role { get; set; } public DbSet<T_User_RoleRelation> T_User_RoleRelation { get; set; } public DbSet<T_Info_BusinessDirectory> T_Info_BusinessDirectory { get; set; } public DbSet<T_Info_SbhCmpRelation> T_Info_SbhCmpRelation { get; set; } public DbSet<T_Info_EnterpriseInterest> T_Info_EnterpriseInterest { get; set; } } }
附:
如下是csdn里有一群程序員在討論類似EF問題:http://bbs.csdn.net/topics/390398765