国产数据库神舟通用使用 EFCore 增删改查 (官方提供程序)
目前 Nuget 包还在 预览阶段 欢迎大家在使用的过程中发现问题, 可以随时反馈给我或者神舟通用有限公司
下面简单介绍使用方式和案例
使用说明
1.安装 Oscar EFCore提供程序包
Visual Studio
-
通过 NuGet 包管理器添加
打开 NuGet 包管理器,在 浏览器 选项的搜索框中输入ShenTong.EntityFrameworkCore.Oscar
并勾选 包括预发行版,搜索并安装。 当前最新 1.0.8。 -
通过程序包管理器控制台安装
PM> Install-Package ShenTong.EntityFrameworkCore.Oscar
Visual Code
PS> cd mydir
PS> dotnet add package ShenTong.EntityFrameworkCore.Oscar
2. 使用提供提供程序
下面提供两个简单的使用示例
数据库表
CREATE SCHEMA DEMO;
CREATE TABLE DEMO.USERS (Id INT AUTO_INCREMENT PRIMARY KEY,Name VARCHAR(64) NOT NULL,Age INT,BirthDate TIMESTAMP);
INSERT INTO DEMO.USERS (Name,Age,BirthDate) VALUES ('user1',20,'1991.07.18'),('user2',19,'1992.07.18');
SELECT * FROM DEMO.USERS;
ID NAME AGE BIRTHDATE
1 user1 20 1991-07-18 00:00:00.000
2 user2 19 1992-07-18 00:00:00.000
一个简单的数据模型
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime BirthDate { get; set; }
}
创建MyDbContext
using Microsoft.EntityFrameworkCore;
public class MyDbContext : DbContext
{
public MyDbContext() { }
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseOscar("Server=ip;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;");
// optionsBuilder.UseOscar(Constants.ConnectStrings, ops => {
// ops.UseDefaultSchema("DEMO"); // 允许配置默认的Schema ,等效与 OnModelCreating 方法中的modelBuilder.HasDefaultSchema()
// ops.UseCaseSensitive(); //配置大小写敏感,默认 false, 当使用该方法 UseCaseSensitive() 大小写敏感为真.
// // 允许传递一个bool参数, true 大小写敏感,false 不区分大小写
// });
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.HasDefaultSchema("DEMO"); //设置默认Schema,可用 HasDefaultSchema("schemaname") 在配置选项中替换
modelBuilder.Entity<User>(b =>
{
b.ToTable("Users");
//b.ToTable("Users","DEMO"); //如果有 Schema
b.HasKey(u => u.Id);
b.Property(u => u.Id).ValueGeneratedOnAdd();
b.Property(u => u.Name).HasMaxLength(64).IsRequired();
});
}
}
在 Console 中试用
static async Task Main(string[] args)
{
// 1
using (var dbContext = new MyDbContext())
{
// query
var userssync = dbContext.Users.ToList();
var usersasync = await dbContext.Users.ToListAsync();
var first = await dbContext.Users.Where(u => u.Name.StartsWith("user")).FirstAsync();
var find = await dbContext.Users.FindAsync(1);
// add
var newUser = new User { Name = "user3", Age = 22, BirthDate = DateTime.Parse("1998.10.20") };
dbContext.Users.Add(newUser);
dbContext.SaveChanges();
// update
newUser.Age = 23;
dbContext.Users.Attach(newUser);
dbContext.SaveChanges();
// remove
dbContext.Users.Remove(newUser);
dbContext.SaveChanges();
//addrang
var addUsers = new List<User>();
for (var index = 4; index < 10; index++)
{
addUsers.Add(new User { Name = $"user{index}", Age = index, BirthDate = DateTime.Parse("1998.10.20").AddDays(index) });
}
dbContext.Users.AddRange(addUsers);
dbContext.SaveChanges();
//批量更新
for (var index = 0; index < 6; index++)
{
addUsers[index].Name = $"user_{index}";
}
dbContext.Users.AttachRange(addUsers);
dbContext.SaveChanges();
//批量删除
dbContext.Users.RemoveRange(addUsers);
dbContext.SaveChanges();
}
// 2
var connectStrings = "Server=ip;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;";
var dbContextOptionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
dbContextOptionsBuilder.UseOscar(connectStrings);
using var _dbContext = new MyDbContext(dbContextOptionsBuilder.Options);
// todo
}
IoC 依赖注入的方式
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(optionsAction =>
{
optionsAction.UseOscar("Server=ip;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;");
});
//or
services.AddDbContext<MyDbContext>(optionsAction =>
{
optionsAction.UseOscar(Configuration.GetConnectionString("DefaultConnectionString"));
});
//or
services.AddDbContext<MyDbContext>(optionsAction =>
{
optionsAction.UseOscar(Constants.ConnectStrings,action => {
action.UseDefaultSchema("myschema");
action.UseCaseSensitive();
});
});
}