Entity Framework 6 自定义连接字符串ConnectionString连接MySQL
在开始介绍之前,首先来看看官方对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 ""; } }
如果想查看当前代码示例请点击此处进行下载!