簡體   English   中英

使用Fluent NHibernate覆蓋C#屬性訪問器方法的基本行為

[英]Overriding the base behavior of a C# property accessor method with Fluent NHibernate

我有一堆C#類,它們從一個抽象基類繼承了許多屬性。 所有類型都使用Fluent NHibernate映射到數據庫模型,並且所有屬性定義都使用自動getter和setter(標准的“get; set;”語法)。 我最近發現需要為我的一個派生類型的基本類型屬性提供一個訪問器方法的特定實現。 所以我為基類屬性創建了一個顯式的后備字段:

public abstract class BaseEntity : IBaseEntity
{
    protected bool active_field;

    ...

    public virtual bool active { get { return active_field; } set { active_field = value; } }

    ...

}

然后在派生類型定義中為“active”屬性定義特定的getter邏輯:

public override bool active
    {
        get { return active_field && (this.Expiration == null || this.Expiration < DateTime.Now); }
        set { active_field = value; }
    }

但是,當我啟動項目時,NHibernate會拋出異常:

FluentNHibernate.dll中出現“System.InvalidOperationException”類型的異常,但未在用戶代碼中處理。 附加信息:嘗試在已添加時添加屬性“活動”。

我猜這與NHibernate有關,需要為屬性定義提供它自己的覆蓋(因此為什么它要求屬性首先被聲明為虛擬),但我並不是所有NHibernate的精明。 既然如此,我很樂意提供任何其他細節,但不知道還有什么相關的。 是否有一個明顯的原因導致無法正常工作? 如果是這樣,有一個簡單的解決方法嗎?

我不確定你的問題的根源,但是,試着回答你的問題:

  1. NHibernate需要所有屬性都是虛擬的,以允許延遲加載,因為它創建了實體類型的代理類型(這是類的擴展)。 它需要它們是虛擬的,因此它可以覆蓋它們並在其中注入新的行為(用數據庫值填充它們);
  2. 您可以映射非公共屬性和字段,但您必須明確地執行此操作,並按照如何使用FluentNHibernate執行此操作的示例。

映射私有財產或字段:

public class EntityMap : ClassMap<Entity>
{
    Id(e => e.Id).GeneratedBy.Identity();
    Map(Reveal.Member<Entity>("PrivatePropertyName"));
}

現在建議嘗試解決您的問題:您可以使用new關鍵字隱藏擴展類的屬性(屬性仍然需要是虛擬的 )。

public virtual new bool active
{
    get { return active_field && (this.Expiration == null || this.Expiration < DateTime.Now); }
    set { active_field = value; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM