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
相关产品推荐
相关产品推荐

