ASP.Net Core 2 如何不使用EF Core查询SQL Server数据库?
Hey there, sorry to hear you're stuck dealing with that messy old read-only SQL Server database where EF Core scaffolding keeps failing. Since you can't modify the schema, let's dive into some practical alternatives that don't rely on automatic model generation:
1. 用Dapper(轻量ORM,灵活适配旧库结构)
Dapper是一款轻量型ORM,能让你完全掌控SQL查询,不用依赖自动生成模型。面对结构混乱的旧数据库时特别好用——你可以手动把奇怪的列名映射到整洁的实体属性上。
步骤:
- 安装Dapper NuGet包:
Install-Package Dapper - 示例代码:
using System.Data.SqlClient; using Dapper; public class OldDatabaseService { private readonly string _connectionString; public OldDatabaseService(string connectionString) { _connectionString = connectionString; } public IEnumerable<YourCustomEntity> GetTargetData(string filterValue) { // 编写适配旧表奇怪列名的SQL语句 string query = @"SELECT Oddly_Named_Column AS CleanColumnName, Another_Broken_Column AS BetterColumnName FROM Messy_Old_Table WHERE Filter_Column = @FilterParam"; using (var connection = new SqlConnection(_connectionString)) { connection.Open(); // 将查询结果映射到你的整洁实体类 return connection.Query<YourCustomEntity>(query, new { FilterParam = filterValue }); } } } // 手动定义带有整洁属性名的实体类 public class YourCustomEntity { public string CleanColumnName { get; set; } public string BetterColumnName { get; set; } }
这种方式能解决任何架构怪问题——不管是奇怪的列名、非标准数据类型,还是旧数据库的其他奇葩设定,同时还能保持代码整洁。
2. 原生ADO.NET(完全自定义,无ORM限制)
如果你需要绝对掌控数据库调用的每一个细节,直接用原生ADO.NET就好。代码量会多一点,但你能处理任何ORM搞不定的、最混乱的表结构。
示例代码:
using System.Data.SqlClient; using System.Collections.Generic; public class RawDatabaseService { private readonly string _connectionString; public RawDatabaseService(string connectionString) { _connectionString = connectionString; } public List<YourCustomEntity> FetchData() { var results = new List<YourCustomEntity>(); string query = "SELECT Oddly_Named_Column, Another_Broken_Column FROM Messy_Old_Table"; using (var connection = new SqlConnection(_connectionString)) { connection.Open(); using (var command = new SqlCommand(query, connection)) { using (var reader = command.ExecuteReader()) { while (reader.Read()) { // 手动将每一列映射到你的实体类 results.Add(new YourCustomEntity { CleanColumnName = reader.GetString(reader.GetOrdinal("Oddly_Named_Column")), BetterColumnName = reader.GetString(reader.GetOrdinal("Another_Broken_Column")) }); } } } } return results; } }
当你需要处理特殊数据转换、非标准表关系这类ORM难以应付的边缘情况时,这个方法就很合适。
3. 手动创建EF Core模型(绕开自动Scaffold)
如果你还是想用EF Core,但无法生成整个数据库的脚手架,可以手动构建DbContext和实体类,忽略架构中有问题的部分。
示例代码:
using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations.Schema; // 手动将实体映射到旧表和旧列 [Table("Messy_Old_Table")] public class YourCustomEntity { [Column("Oddly_Named_Column")] public string CleanColumnName { get; set; } [Column("Another_Broken_Column")] public string BetterColumnName { get; set; } } public class CustomOldDbContext : DbContext { public DbSet<YourCustomEntity> YourEntities { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("你的SQL Server连接字符串"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 只包含你需要的实体/表——忽略任何有问题的部分 modelBuilder.Entity<YourCustomEntity>(); // 如果有其他导致问题的表,可以用 modelBuilder.Ignore<ProblematicEntity>(); } }
这样你就能继续使用EF Core的LINQ查询能力,同时避开那些导致脚手架失败的数据库部分。
最后总结
因为你的数据库是只读状态,不用考虑写迁移或架构更新的问题——这些方法都专注于查询数据。根据你的习惯选就好:
- Dapper是灵活性和代码简洁性的最佳平衡点
- 原生ADO.NET适合需要完全掌控细节的场景
- 手动EF Core模型适合偏爱LINQ而非原生SQL的情况
内容的提问来源于stack exchange,提问作者Gravious




