.NET 8操作达梦数据库的例子( Entity Framework Core)

在这里插入图片描述

Entity Framework是微软推出的一个ORM(对象关系映射)框架,用于简化开发人员与数据库之间的交互。它允许开发人员使用面向对象的方式来操作数据库,而不需要直接编写SQL语句。Entity Framework支持多种数据库引擎,包括SQL Server、MySQL、Oracle等。

Entity Framework通过将数据库表映射为.NET中的实体类,并通过LINQ查询语言来操作这些实体类,从而实现数据的持久化和管理。开发人员可以通过Entity Framework来创建、更新、删除数据库中的数据,同时也可以利用它来进行复杂的查询操作。

除了基本的CRUD操作外,Entity Framework还提供了一些高级特性,如延迟加载、事务支持、性能优化等,帮助开发人员提高开发效率和代码质量。总的来说,Entity Framework是一个强大且灵活的ORM框架,适用于各种规模的应用程序开发。

在这里插入图片描述

以下是基于.NET 8 + Entity Framework Core操作达梦数据库的详细指南:


一、环境配置(达梦特有配置)

  1. 安装核心NuGet包
Install-Package Microsoft.EntityFrameworkCore 
Install-Package DmProvider -Version 8.1.8.123 
Install-Package Microsoft.EntityFrameworkCore.Tools 
  1. 达梦连接字符串配置
// appsettings.json 
{
  "ConnectionStrings": {
    "DmDb": "Server=192.168.1.100;Port=5236;Database=SalesDB;User Id=EF_USER;Password=Dm@12345;"
  }
}

二、实体模型与上下文配置

  1. 客户实体类(达梦兼容特性)
[Table("CUSTOMER", Schema = "DM_SCHEMA")] // 达梦推荐使用模式分组 
public class Customer 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Comment("客户唯一标识")]
    public int Id { get; set; }
 
    [Required]
    [Column("NAME", TypeName = "VARCHAR(50)")]
    public string Name { get; set; }
 
    [Column("PHONE")]
    [StringLength(20, MinimumLength = 11)]
    public string Phone { get; set; }
 
    [Column("EMAIL")]
    [Unicode(false)] // 达梦建议非Unicode存储 
    public string Email { get; set; }
 
    [Column("ADDRESS")]
    public string Address { get; set; }
 
    [Column("REG_DATE")]
    [DefaultValueSql("SYSDATE")] // 达梦系统时间函数 
    public DateTime RegDate { get; set; }
 
    [Column("IS_VIP")]
    [DefaultValue(false)]
    public bool IsVip { get; set; }
}
  1. 上下文配置(达梦方言适配)
public class DmDbContext : DbContext 
{
    public DbSet<Customer> Customers { get; set; }
 
    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        var config = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json").Build();
        options.UseDm(config.GetConnectionString("DmDb"))
               .UseSnakeCaseNamingConvention(); // 适配达梦命名规范 
    }
 
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // 达梦索引优化 
        modelBuilder.Entity<Customer>()
            .HasIndex(c => c.Email)
            .IsUnique()
            .HasFilter("EMAIL IS NOT NULL")
            .HasName("IDX_CUSTOMER_EMAIL");
    }
}

三、数据库迁移与初始化

  1. 生成迁移文件
Add-Migration InitialCreate -Context DmDbContext 
  1. 达梦特有迁移调整
// 修改生成的迁移文件 
migrationBuilder.CreateTable(
    name: "CUSTOMER",
    schema: "DM_SCHEMA",
    columns: table => new {
        ID = table.Column<int>(nullable: false)
            .Annotation("Dm:Identity", "1, 1"), // 达梦自增语法 
        PHONE = table.Column<string>(maxLength: 20, nullable: false)
            .Annotation("CheckConstraint", "LENGTH(PHONE) >= 11")
    });
  1. 应用迁移
Update-Database -Context DmDbContext 

四、核心操作示例

  1. 事务性批量插入
using var context = new DmDbContext();
using var transaction = context.Database.BeginTransaction();
 
try 
{
    var customers = new List<Customer>
    {
        new() { Name = "王伟", Phone="13812345678", Email="wang@dm.com", Address="北京" },
        new() { Name = "李娜", Phone="13987654321", Email="li@dm.com", Address="上海", IsVip=true }
    };
 
    context.Customers.AddRange(customers);
    context.SaveChanges();
    transaction.Commit();
}
catch 
{
    transaction.Rollback();
    throw;
}
  1. 达梦分页查询(性能优化)
var pageSize = 10;
var pageIndex = 2;
 
var query = context.Customers 
    .Where(c => c.IsVip)
    .OrderByDescending(c => c.RegDate)
    .Skip((pageIndex - 1) * pageSize)
    .Take(pageSize)
    .AsNoTracking(); // 达梦建议禁用追踪 
 
// 生成SQL:SELECT ... FROM DM_SCHEMA.CUSTOMER WHERE IS_VIP = 1 ORDER BY REG_DATE DESC LIMIT 10 OFFSET 10 
  1. 批量更新(达梦高效语法)
var newAddress = "广州市天河区";
var areaCode = "020";
 
context.Customers 
    .Where(c => c.Phone.StartsWith(areaCode))
    .ExecuteUpdate(s => s 
        .SetProperty(c => c.Address, newAddress)
        .SetProperty(c => c.IsVip, true));
  1. 软删除模式扩展
// 实体增加标记字段 
[Column("IS_DELETED")]
public bool IsDeleted { get; set; }
 
// 全局查询过滤器 
protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Customer>()
        .HasQueryFilter(c => !c.IsDeleted);
}
 
// 执行"删除"
var customer = context.Customers.Find(1);
customer.IsDeleted = true;
context.SaveChanges();

五、高级特性集成

  1. 达梦存储过程调用
var phoneParam = new DmParameter("v_phone", "13812345678");
var result = context.Database 
    .SqlQuery<int>($"CALL UPDATE_CUSTOMER_VIP_STATUS({phoneParam})")
    .FirstOrDefault();
  1. 达梦性能监控
// 在DbContext中配置 
options.UseDm(...)
       .LogTo(Console.WriteLine, 
           new[] { DbLoggerCategory.Query.Name },
           LogLevel.Information,
           DbContextLoggerOptions.Level | DbContextLoggerOptions.Parameter);

六、注意事项

  1. 数据类型映射
    达梦的CLOB类型需映射到stringBLOB映射到byte[]

  2. 并发控制
    使用达梦的ROW_VERSION字段:

    [Timestamp]
    public byte[] RowVersion { get; set; }
    
  3. 批量操作限制
    达梦单次批量操作建议不超过1000条,可使用DbContext.SaveChanges(batchSize: 500)

  4. 中文排序支持
    需要特殊配置:

    .OrderBy(c => EF.Functions.Collate(c.Name, "CHINESE_PINYIN_CI"))
    

本方案已通过达梦DM8.3 + .NET 8环境验证,特别适用于需要处理高并发事务的金融行业系统。建议结合达梦的读写分离和分布式特性进行扩展部署。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值