You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.Net Core 2 如何不使用EF Core查询SQL Server数据库?

解决ASP.NET Core 2连接有缺陷的只读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

火山引擎 最新活动