3. KingbaseES的EF6编程指南
本部分描述了KingbaseES 的EF6的环境搭建以及程序开发示例。
3.1. 环境搭建
3.1.1. 工程搭建
工程搭建步骤可参考 参考用例一 中的步骤1。
3.1.2. 服务的配置方法和参数说明
相关使用,以及参数设置可参考 KingbaseES客户端编程接口指南-ado.net 中kdbndp中连接字符串的解析。
3.2. 程序开发示例
3.2.1. 连接数据库
作用:
连接数据库参数配置。
格式:
相关使用以及参数设置可参考 KingbaseES客户端编程接口指南-ado.net 中kdbndp中连接字串的解析。
3.2.2. 参考用例一
目的
通过本用例可了解如何引用EntityFramework6.Kdbndp.dll,在程序中如何使用EntityFramework6.Kdbndp。
系统必备
所需VS版本不低于Visual Studio 2010,如果使用 Visual Studio 2010,您还需要安装 NuGet 。
步骤
1)创建应用程序;
为了方便起见,我们要构建使用 Code First 来执行数据访问的基本的控制台应用程序:
-
打开 Visual Studio;
-
文件->新增->项目...;
-
选择Windows左侧的菜单和控制台应用程序;
-
输入kb_ef6_test作为名称;
-
单击“确定”。
2)定义模型;
-
添加类文件Modules.cs;
-
在添加类文件中添加如下代码:
public enum State { None, 有用, 无用 } public class Test { [Key] public Guid Id { get; set; } public Guid? Ids { get; set; } public string Name { get; set; } public bool Sex { get; set; } public bool? Sexy { get; set; } public int Age { get; set; } public int? Ager { get; set; } public DateTime Birth { get; set; } public DateTime? Birthy { get; set; } public float Money { get; set; } public float? Moneies { get; set; } public double Pi { get; set; } public double? Pis { get; set; } public State State { get; set; } public State? States { get; set; } public byte[] RowVersion { get; set; } }
注意
byte[]定义的变量属性不能用Data Annatation标记为[TimeStamp],标记会出现错误。
3)创建上下文;
-
定义派生的上下文,它表示我们在数据库中能够查询和保存数据的会话。 定义的上下文,它派生自 System.Data.Entity.DbContext;
-
为了使用实体框架中的类型,我们需要添加 EntityFramework NuGet包。在Nuget控制台中输入命令:
Install-Package EntityFramework
-
在“引用”中添加EntityFramework6.Kdbndp.dll,Kdbndp.dll的引用;
-
在Modules.cs 的顶部添加 using 语句:
using System.Data.Entity; using System.ComponentModel.DataAnnotations; C# public class BloggingContext : DbContext { public BloggingContext() : base("name=TestKbContext") { } public DbSet <Test> Blogs { get; set; } }
红色标记为连接数据库字符串名。
4)在App.config或Web.config
-
连接数据库的配置:
<connectionStrings> <add name="TestKbContext" connectionString="Server=192.168.28.212;Database=test1; User Id=SYSTEM;Password=MANAGER;Port=54328" providerName="Kdbndp" /> </connectionStrings>
-
添加provider相关信息,标红部分:
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="Kdbndp" type="Kdbndp.KdbndpServices, EntityFramework6.Kdbndp" /> </providers> </entityFramework>
-
添加system.data:
<system.data> <DbProviderFactories> <remove invariant="Kdbndp"></remove> <add name="Kdbndp Data Provider" invariant="Kdbndp" description=".Net Framework Data Provider for KingbaseES Server" type="Kdbndp.KdbndpFactory, Kdbndp" /> </DbProviderFactories> </system.data>
5)创建模型;
在Nuget控制台中依次输入以下命令:
Enable-Migrations Add-Migration InitialCreate Update-Database
执行完前两条命令会生成类似 201908080542058_KB_Test2s.cs 文件。
6)操作使用模型。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace kb_ef6_test { class Program { static void Print(Modules db,String strShowInfo) { var query = from b in db.KB_Tests orderby b.Name select b; Console.WriteLine(strShowInfo); foreach (var item in query) { Console.WriteLine(item.Name); } Console.WriteLine("data search over...."); } static void Main(string[] args) { using (var db = new Modules()) { /* 增加数据 */ var blog = new Test { Id = Guid.NewGuid(), Ids = Guid.NewGuid(), Name = "刘备", Sex = true, Sexy = true, Age = 45, Ager = 45, Birth = DateTime.Now, Birthy = DateTime.Now, Money = 1.5f, Moneies = 1.5f, Pi = 36.25, Pis = 36.25, State = State.无用, States = State.有用, RowVersion = Enumerable.Repeat((byte)0x08, 10).ToArray() }; db.KB_Tests.Add(blog); db.SaveChanges(); /* 查询数据 */ Print(db, "search data after add"); /* 修改数据 */ var temp = db.KB_Tests.FirstOrDefault(s => s.Name == "刘备"); temp.Name = "张飞"; db.SaveChanges(); Print(db, "search data after update"); /* 删除数据 */ temp = db.KB_Tests.FirstOrDefault(s => s.Name == "刘备"); db.KB_Tests.Remove(temp); db.SaveChanges(); Print(db, "search data after delete"); } Console.WriteLine("press any key to exit......."); Console.ReadKey(); } } }
3.2.3. 参考用例二
在 参考用例一 的基础上,如果需要在模型中添加新的表或者为原有模型表中添加字段,则可使用以下步骤:
-
更新模型数据
Update-Database –Verbose
注意
添加参数–Verbose可以看到更新打印的详细信息,这样有助查询更新失败或者错误的原因。
-
通过Migration生成新的模型文件
Add-Migration 模型名称
-
更新模型数据到数据库
Update-Database –Verbose
-
简单实例
在 参考用例一 的基础上添加新表类。
public class Test2 { [Key] public Guid Id { get; set; } public Guid? Ids { get; set; } public string Name { get; set; } public bool Sex { get; set; } public bool? Sexy { get; set; } public int Age { get; set; } public int? Ager { get; set; } public DateTime Birth { get; set; } public DateTime? Birthy { get; set; } public float Money { get; set; } public float? Moneies { get; set; } public double Pi { get; set; } public double? Pis { get; set; } public State State { get; set; } public State? States { get; set; } public byte[] RowVersion { get; set; } } public class BloggingContext : DbContext { public BloggingContext() : base("name=TestKbContext") { } public DbSet Blogs { get; set; } public DbSet Test2s{ get; set; } }
在“程序包管理控制台”执行:
Add-Migration Test2s
会生成类似 201908080542058_KB_Test2s.cs 文件。
继续执行:
Update-Database –Verbose
即可在数据库中生成新添加的类对应的表。