EF Core 6-防止查询特定列



上下文

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类中

最新更新