2011-08-10 21 views
2

我正在使用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]屬性。我測試了這個,它工作正常。如有必要,我可以回到這種方法,但有興趣嘗試使上述方法概述起作用。

回答

0

接下來,我沒有找到一種方法來直接實現我所描述的。根據C#中的屬性的工作原理,我可以看到很難或不可能實現這樣的事情。

相反,我只是將[Encrypted]屬性添加到PersonName類的每個屬性中,並且讓那些生成的數據庫表中的PersonName列始終被加密。在未來,如果我確實需要將PersonName映射爲另一個實體的非加密「組件」,那麼我也許可以使用爲其所有映射列/組件禁用加密的屬性修飾非加密類,重寫在該類的屬性/組件映射中找到的任何[Encrypted]屬性。

相關問題