You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entity Framework Core结合存储过程实现SQL Server列级加密:属性映射问题

解决EF Core中[NotMapped]属性无法从存储过程获取值的问题

以下是几种可行的解决方法:

方法1:使用查询专用DTO接收结果

创建一个不带[NotMapped]属性的DTO类,专门用于接收存储过程返回的解密后数据,避免影响原实体的映射规则:

// 查询专用DTO
public class TestQueryDto
{
    public long Id { get; set; }
    public string SSNumber { get; set; }
    public byte[] SSNumberEncrypted { get; set; }
}

// 调用存储过程并映射到DTO
var results = await context.Set<TestQueryDto>()
    .FromSqlRaw("EXEC 你的存储过程名称")
    .ToListAsync();

之后可按需将DTO数据转换为原Test实体。

方法2:手动映射原始查询结果

通过SqlQuery获取存储过程的原始动态结果,再手动赋值给Test实体的SSNumber属性:

// 执行存储过程获取动态结果
var rawData = await context.Database.SqlQuery<dynamic>("EXEC 你的存储过程名称").ToListAsync();

// 手动映射到Test实体
var testEntities = rawData.Select(item => new Test
{
    Id = item.Id,
    SSNumber = item.SSNumber,
    SSNumberEncrypted = item.SSNumberEncrypted
}).ToList();

方法3:用Fluent API替代[NotMapped]

移除Test实体中SSNumber的[NotMapped]属性,改用EF Core的Fluent API配置忽略该属性的数据库映射,这样实体属性可正常接收存储过程返回值:

// 修改后的Test实体
public class Test 
{
    public long Id { get; set; }
    public string SSNumber { get; set; }
    public byte[] SSNumberEncrypted { get; set; }
}

// 在DbContext的OnModelCreating中配置忽略映射
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Test>()
        .Ignore(t => t.SSNumber);
}

// 调用存储过程时正常接收结果
var testList = await context.Set<Test>()
    .FromSqlRaw("EXEC 你的存储过程名称")
    .ToListAsync();

内容的提问来源于stack exchange,提问作者Alberto López

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:32:33