上下文
EF Core 6,数据库中的某些列使用Always encrypted 加密
问题
无法查询那些加密的列。在某些情况下,EF会抛出异常;其他人则不然。但原则上,我们不想对这些加密列进行查询,因为结果不正确。但是,有时开发人员会犯错误,因为他们忘记了这些加密字段。。。
愿望
检查查询(在EF将其发送到数据库服务器之前(,如果查询中存在任何加密列,则抛出异常。有什么办法做到这一点吗?
如果您想从EF Core中排除某些列,您可以在OnModelCreating方法中使用[NotMapped]或使用fluent API标记表示这些列的属性。这将告诉EF Core在从数据库中检索实体时不要查询这些列。
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
[NotMapped]
public String SecretData{ get; set; }
}
参考https://learn.microsoft.com/en-us/ef/core/modeling/entity-properties?tabs=fluent-api%2无nrt
另一种选择是使用数据传输对象(DTO(来排除加密的列。
public class BlogDTO
{
public int BlogId { get; set; }
public string Url { get; set; }
}
然后使用EF Core选择未加密的列并映射到DTO。
var blogDto = context.Blogs
.Where(x => x.Id == blogId)
.Select(x => new BlogDTO {
BlogId = x.BlogId1,
Url = x.Url
// etc, don't include the SecretData column
});
ref从实体框架中排除某些列选择报表
我会使用阴影属性
Shadow属性是.NET中未定义的属性实体类直接;相反,您为特定的实体数据模型中的实体类型。它们可以在上下文类的OnModelCreating((方法。
这是一篇关于如何使用的完整文章
https://www.entityframeworktutorial.net/efcore/shadow-property.aspx
通过这样做,您将能够阻止调用此属性,因为它不存在于.Net类中