在開始介紹之前,首先來看看官方對Entity Framework的解釋:Entity Framework (EF) is an object-relational mapper that enables .NET developers to work with relational data using domain-specific objects. It eliminates the need for most of the data-access code that developers usually need to write.這里面涉及到幾個關鍵的知識點:1 首先它是一個對象關系映射。2 其次它使用的是特定於域的對象。 3 它摒棄了傳統的通過SQL語句來訪問數據庫的方式。其實我們通過對比Linq To SQL我們會發現他們幾乎都是一樣的。因為人的思想更習慣於使用面向對象的方式,因為它更便於理解而且也使用起來更加方便快捷。
下面就來一步步介紹如何在VS2015中添加ADO.NET實體數據模型。
圖一 添加ADO.NET實體數據模型
1 新建一個文件夾,並向這個文件夾中添加一個ADO.NET實體數據模型,例如ModelTest。
2 添加一個來自數據庫的EF設計器,這里有四個選項,每一個都對應一種模型內容,這里暫時不介紹,在以后的序列中在做介紹。
圖二 選擇模型內容
3 新建連接。
圖三 新建連接
圖四 選擇數據源
圖五 修改連接屬性
4 選擇數據庫對象,並生產對象關系映射。
圖六 選擇數據庫對象和設置
圖七 生產的特定於域的對象
下面一部分我們來看看自動生成的連接字符串。
<add name="dvapEntities" connectionString="metadata=res://*/EF6.ModelTest.csdl|res://*/EF6.ModelTest.ssdl|res://*/EF6.ModelTest.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=root;password=12345;database=dvap"" providerName="System.Data.EntityClient" />
有時候我們不僅僅需要在配置文件中配置,這樣我們就暴露了很多重要的信息,而在很多時候我們需要通過代碼來生成連接字符串,那么這該怎么做呢?因為這個配置文件還是包含很多信息的,經過我的許多努力,終於在msdn上面找到了答案。
string server = System.Configuration.ConfigurationManager.AppSettings["MySQLServer"]; if (!string.IsNullOrEmpty(server)) { string providerName = "MySql.Data.MySqlClient"; MySqlConnectionStringBuilder sqlbulider = new MySqlConnectionStringBuilder(); sqlbulider.Server = server; sqlbulider.UserID = "root"; sqlbulider.Password = "12345"; sqlbulider.Database = "dvap"; sqlbulider.AllowZeroDateTime = true; sqlbulider.ConvertZeroDateTime = true; sqlbulider.IntegratedSecurity = true; EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = providerName; entityBuilder.ProviderConnectionString = sqlbulider.ToString(); entityBuilder.Metadata = @"res://*/EF6.DvapRegularModel.csdl|res://*/EF6.DvapRegularModel.ssdl|res://*/EF6.DvapRegularModel.msl"; m_ConnectionString = entityBuilder.ToString(); }
通過上面的方式我們能夠生成正確的連接字符串,在生成連接字符串之后我們需要將這個連接字符串傳入到自動生成的dvapEntities對象中,這里也貼出部分代碼。
namespace TestEF6.EF6 { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class dvapEntities : DbContext { public dvapEntities() : base("name=dvapEntities") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<dvap_scene_business> dvap_scene_business { get; set; } public virtual DbSet<echarts_barcharts_singleverticalcolumn> echarts_barcharts_singleverticalcolumn { get; set; } public virtual DbSet<echarts_barcharts_singleverticalcolumnproperty> echarts_barcharts_singleverticalcolumnproperty { get; set; } public virtual DbSet<logs> logs { get; set; } public virtual DbSet<options> options { get; set; } public virtual DbSet<test_stackhistogram> test_stackhistogram { get; set; } public virtual DbSet<users> users { get; set; } } }
僅僅使用默認的 dvapEntities函數肯定達不到要求,我們需要重載一個能夠將連接字符串作為參數的構造函數,這里我們表述如下:
public dvapEntities(string connectionString) :base(connectionString) { }
后面我們就可以使用這個構造函數來獲取數據庫中相應的數據了,這里我們也貼出相關的代碼來作為參考。
public string GetOptionValue(string option_name) { try { using (var db = new EF6.dvapEntities(m_ConnectionString)) { EF6.options option = null; option = (from x in db.options where x.OptionName == option_name && x.UserID == 0 select x).SingleOrDefault() ?? null; if (null != option) { return option.OptionValue; } } return ""; } catch (Exception ex) { return ""; } }
如果想查看當前代碼示例請點擊此處進行下載!