我在 VS2010 的项目中首先使用实体框架模型。
我想知道是否有办法在.edmx窗口或属性password
窗口中设置要加密的字段。我不想更改生成的 .cs 文件,因为每次修改模型时都会覆盖它。
我在 VS2010 的项目中首先使用实体框架模型。
我想知道是否有办法在.edmx窗口或属性password
窗口中设置要加密的字段。我不想更改生成的 .cs 文件,因为每次修改模型时都会覆盖它。
EF 没有任何内置的加密支持,也不支持数据库加密机制(除非您在 SQL Server 中使用透明加密来加密整个数据库)。
作为一种解决方法,您可以在应用程序中进行集中加密和解密。这是高级想法:
string
属性 - 此属性将表示为nvarchar
目标数据库中的列SaveChanges
您ObjectContext
或DbContext
继承的部分类中的方法(或处理继承类SavingChanges
的事件ObjectContext
)。在此方法/处理程序中搜索处于Added
或Modified
状态(使用ObjectStateManager
或DbChangeTracker
)的实体的所有实例,从应加密的属性中获取值,对其进行加密并将加密值以 Base64 格式存储回属性。如果在您加密所有实例的属性后进行SaveChanges
覆盖调用。base.SaveChanges
ObjectMaterialized
甚至在继承的类上处理ObjectContext
(在 DbContext 中,您必须使用从您的实例IObjectContextAdapter
中获取实例),从属性中获取加密值,将其从 Base64 格式转换为字节数组,解密并将其存储回属性。这可能会导致一些其他并发症,因为更改属性值可能会导致修改状态,但您也应该能够修复它。ObjectContext
DbContext
一个更简单的选择是创建一个部分类,它添加一个处理加密和解密的新属性。然后,您将在代码中引用这个新属性,而不是表对象中的 Password 属性。
Partial Public Class ObjectName
Public Property PasswordValue As String
Get
Return Password.Decrypt()
End Get
Set(value As String)
Password = value.Encrypt()
End Set
End Property
End Class
在这种情况下,我在字符串对象上创建了扩展方法来做到这一点。我使用以下链接中的代码进行加密和解密: