我正在使用Fluent NHibernate(1.2),並且正在實施列級別的加密。我有一個處理加密的自定義類型,以便域模型可以具有本機明文數據類型(簡單字符串,整數,日期時間等),並且所有加密/解密工作都在幕後。Fluent NHibernate:將屬性應用到通過組件映射的屬性的所有成員
我想指定每個域模型中要通過屬性進行加密的屬性,並使用約定來指定這些屬性的自定義類型,以便域模型是沒有提及自定義類型的不錯的POCO:
public class EncryptedAttribute : Attribute {}
public class UserRecord {
public virtual Guid Id { get; set; }
public virtual string Username { get; set; }
[Encrypted]
public virtual string EmailAddress { get; set; }
[Encrypted]
public virtual DateTime DateOfBirth { get; set; }
[Encrypted]
public virtual PersonName LegalName { get; set; }
// etc.
}
public class PersonName {
public virtual string Given { get; set; }
public virtual string Middle { get; set; }
public virtual string Family { get; set; }
}
public class EncryptedColumnConvention
: AttributePropertyConvention<EncryptedAttribute> {
protected override void Apply(
EncryptedAttribute attribute, IPropertyInstance instance)
{
var dbType = typeof(EncryptedColumnType<>).MakeGenericType(domainType);
instance.CustomType(dbType);
}
}
public class UserRecordMap : ClassMap<UserRecord> {
public UserRecordMap() {
Id(o => o.Id);
Map(o => o.Username);
Map(o => o.EmailAddress);
Map(o => o.DateOfBirth);
Component(o => o.LegalName).ColumnPrefix("LegalName");
// etc.
}
}
public class PersonNameMap : ComponentMap<PersonName> // etc.
如上所示,我試圖將這一切與AttributePropertyConvention結合在一起。這適用於簡單的屬性,例如EmailAddress將得到一個自定義類型的EncryptedColumnType。
但它不適用於通過組件映射的複雜類型(例如LegalName)的屬性。我想要的是加密LegalName的每個屬性,因爲我使用[Encrypted]對其進行了裝飾。換句話說,我希望UserRecord數據庫表有三個加密的 名稱字段 - 給定,中間和家庭。
似乎AttributePropertyConvention根本沒有被應用於LegalName或其任何成員屬性。也許我需要用另一種公約來處理這種情況?
我知道我可以用[加密]來裝飾PersonName中的單個屬性,而不是裝飾UserRecord中的[LegalName]屬性。我測試了這個,它工作正常。如有必要,我可以回到這種方法,但有興趣嘗試使上述方法概述起作用。