ashx实现的Web端点升级.NET Core时EF Core适配问题咨询
EF Core 手动适配现有数据库方案
前置说明
EF Core 完全支持手动映射现有数据库(Database First 模式),不需要依赖 scaffolding 工具自动生成代码,两张表的场景手动编写映射的成本极低,远低于排查工具报错或学习额外框架知识的成本。
手动编写 EF Core 映射示例
第一步:安装依赖
- 仅需安装 SQL Server 对应的 EF Core 驱动包即可:
Microsoft.EntityFrameworkCore.SqlServer
第二步:编写实体类
按你的实际表结构编写对应的C#类即可,以下为示例:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; // 第一张表对应实体,可替换为你的实际表字段 public class Table1 { // 标注主键,若为自增主键需加DatabaseGenerated特性 [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [MaxLength(50)] public string Field1 { get; set; } public int Field2 { get; set; } public DateTime? CreateTime { get; set; } } // 第二张表对应实体 public class Table2 { [Key] public Guid UniqueId { get; set; } public int RelatedTable1Id { get; set; } [MaxLength(200)] public string Remark { get; set; } // 不需要导航属性可直接删除 public Table1 RelatedTable1 { get; set; } }
第三步:编写 DbContext
using Microsoft.EntityFrameworkCore; public class CustomDbContext : DbContext { // 注册两张表的操作集合 public DbSet<Table1> Table1s { get; set; } public DbSet<Table2> Table2s { get; set; } // 配置数据库连接 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 替换为你的实际SQL Server连接字符串 optionsBuilder.UseSqlServer("Data Source=你的实例地址;Initial Catalog=你的库名;User ID=账号;Password=密码;TrustServerCertificate=True"); } // 可选:用Fluent API配置映射,不想在实体上加特性可以用这种方式 protected override void OnModelCreating(ModelBuilder modelBuilder) { // 示例:指定表名、字段映射规则 modelBuilder.Entity<Table1>(t => { t.ToTable("你的第一张表实际名称"); t.Property(x => x.Field1).HasColumnName("表中对应字段名").IsRequired(); }); modelBuilder.Entity<Table2>(t => { t.ToTable("你的第二张表实际名称"); t.HasOne<Table1>(x => x.RelatedTable1).WithMany().HasForeignKey(x => x.RelatedTable1Id); }); } }
第四步:简单调用示例
// 查询操作 using (var db = new CustomDbContext()) { var table1List = db.Table1s.Where(x => x.Field2 > 10).ToList(); } // 新增操作 using (var db = new CustomDbContext()) { db.Table1s.Add(new Table1 { Field1 = "测试数据", Field2 = 20, CreateTime = DateTime.Now }); db.SaveChanges(); }
备选方案:原生SQL实现
如果不想引入EF Core的复杂度,直接使用Microsoft.Data.SqlClient包编写原生SQL即可,两张表的场景维护成本极低:
using Microsoft.Data.SqlClient; using System.Collections.Generic; public static class SqlHelper { private const string ConnectionString = "你的SQL Server连接字符串"; // 查询示例 public static List<Table1> QueryTable1() { var result = new List<Table1>(); using (var conn = new SqlConnection(ConnectionString)) { conn.Open(); var cmd = new SqlCommand("SELECT Id,Field1,Field2,CreateTime FROM 你的表名 WHERE Field2>@Threshold", conn); cmd.Parameters.AddWithValue("@Threshold", 10); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { result.Add(new Table1 { Id = reader.GetInt32(nameof(Table1.Id)), Field1 = reader.GetString(nameof(Table1.Field1)), Field2 = reader.GetInt32(nameof(Table1.Field2)), CreateTime = reader.IsDBNull(nameof(Table1.CreateTime)) ? null : reader.GetDateTime(nameof(Table1.CreateTime)) }); } } } return result; } // 执行增删改示例 public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (var conn = new SqlConnection(ConnectionString)) { conn.Open(); var cmd = new SqlCommand(sql, conn); cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery(); } } }
内容的提问来源于stack exchange,提问作者Alireza Ahmadi Rad
相关产品推荐
相关产品推荐

