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操作达梦数据库的详细指南:
一、环境配置(达梦特有配置)
- 安装核心NuGet包
Install-Package Microsoft.EntityFrameworkCore
Install-Package DmProvider -Version 8.1.8.123
Install-Package Microsoft.EntityFrameworkCore.Tools
- 达梦连接字符串配置
// appsettings.json
{
"ConnectionStrings": {
"DmDb": "Server=192.168.1.100;Port=5236;Database=SalesDB;User Id=EF_USER;Password=Dm@12345;"
}
}
二、实体模型与上下文配置
- 客户实体类(达梦兼容特性)
[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; }
}
- 上下文配置(达梦方言适配)
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");
}
}
三、数据库迁移与初始化
- 生成迁移文件
Add-Migration InitialCreate -Context DmDbContext
- 达梦特有迁移调整
// 修改生成的迁移文件
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")
});
- 应用迁移
Update-Database -Context DmDbContext
四、核心操作示例
- 事务性批量插入
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;
}
- 达梦分页查询(性能优化)
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
- 批量更新(达梦高效语法)
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));
- 软删除模式扩展
// 实体增加标记字段
[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();
五、高级特性集成
- 达梦存储过程调用
var phoneParam = new DmParameter("v_phone", "13812345678");
var result = context.Database
.SqlQuery<int>($"CALL UPDATE_CUSTOMER_VIP_STATUS({phoneParam})")
.FirstOrDefault();
- 达梦性能监控
// 在DbContext中配置
options.UseDm(...)
.LogTo(Console.WriteLine,
new[] { DbLoggerCategory.Query.Name },
LogLevel.Information,
DbContextLoggerOptions.Level | DbContextLoggerOptions.Parameter);
六、注意事项
-
数据类型映射
达梦的CLOB
类型需映射到string
,BLOB
映射到byte[]
-
并发控制
使用达梦的ROW_VERSION
字段:[Timestamp] public byte[] RowVersion { get; set; }
-
批量操作限制
达梦单次批量操作建议不超过1000条,可使用DbContext.SaveChanges(batchSize: 500)
-
中文排序支持
需要特殊配置:.OrderBy(c => EF.Functions.Collate(c.Name, "CHINESE_PINYIN_CI"))
本方案已通过达梦DM8.3 + .NET 8环境验证,特别适用于需要处理高并发事务的金融行业系统。建议结合达梦的读写分离和分布式特性进行扩展部署。