C# nHibernate类中的条件getter

C# nHibernate类中的条件getter,c#,nhibernate,getter,C#,Nhibernate,Getter,我可以有这样一个条件getter: protected District _district; public virtual District District { get { return _district ?? this.Zone; } set { _district = value; } } 我需要检查一个属性是否为null,如果它的null返回同一类的另一个属性 这是一个nHibernate映射类 当我尝试这样做时,服务器只是挂断了…您已经递归地定义了属性(gett

我可以有这样一个条件getter:

protected District _district;
public virtual District District 
{
    get { return _district ?? this.Zone; }
    set { _district = value; }
}
我需要检查一个属性是否为null,如果它的null返回同一类的另一个属性

这是一个nHibernate映射类


当我尝试这样做时,服务器只是挂断了…

您已经递归地定义了属性(getter和setter实际上都调用自己)。您需要使用一个内部字段来存储实际值:

private District district;

public virtual District District 
{
    get 
    {
        return this.district ?? this.Zone; 
    } 
    set
    {
        this.district = value;
    }
}

您已经递归地定义了属性(getter和setter实际上都调用自己)。您需要使用一个内部字段来存储实际值:

private District district;

public virtual District District 
{
    get 
    {
        return this.district ?? this.Zone; 
    } 
    set
    {
        this.district = value;
    }
}

在NHibernate映射的情况下,我不会向映射属性添加任何逻辑。在这种情况下,我将添加一个独特的方法:

public virtual District District  { get; set; }

public virtual District GetDistrictOrDefault()
{
    return District ?? this.Zone;
}
或者,您可能希望保护映射的District属性-您可以提供第二个属性来包装受保护的属性,并提供一些逻辑:

// Mapped with NHibernate
protected virtual District District  { get; set; }

public virtual District DistrictOrDefault // You might find a better naming... 
{
    get 
    {
        return District ?? this.Zone; 
    } 
    set
    {
        District = value;
    }
}

在NHibernate映射的情况下,我不会向映射属性添加任何逻辑。在这种情况下,我将添加一个独特的方法:

public virtual District District  { get; set; }

public virtual District GetDistrictOrDefault()
{
    return District ?? this.Zone;
}
或者,您可能希望保护映射的District属性-您可以提供第二个属性来包装受保护的属性,并提供一些逻辑:

// Mapped with NHibernate
protected virtual District District  { get; set; }

public virtual District DistrictOrDefault // You might find a better naming... 
{
    get 
    {
        return District ?? this.Zone; 
    } 
    set
    {
        District = value;
    }
}

这样做是可能的,而且非常简单。NHibernate允许我们为单个属性指定访问策略。我经常使用这样的东西:

protected District _district;
public virtual District District 
{
    get { return _district ?? this.Zone; }
    set { _district = value; }
}
和属性的映射:

<property name="District" access="field.camelcase-underscore" />

在这个映射方案中,您的代码将使用属性来获取/设置数据,而NHibernate使用字段来执行相同的操作。如果您省略了访问设置,如果property District确实为NULL,NHibernate将认为您已将property District更改为新值,它将尝试更新相应的数据库记录。这可能会导致错误。
我从来没有使用过Fluent NHibernate,所以我不知道如何使用Fluent做到这一点。

这是可能的,而且非常简单。NHibernate允许我们为单个属性指定访问策略。我经常使用这样的东西:

protected District _district;
public virtual District District 
{
    get { return _district ?? this.Zone; }
    set { _district = value; }
}
和属性的映射:

<property name="District" access="field.camelcase-underscore" />

在这个映射方案中,您的代码将使用属性来获取/设置数据,而NHibernate使用字段来执行相同的操作。如果您省略了访问设置,如果property District确实为NULL,NHibernate将认为您已将property District更改为新值,它将尝试更新相应的数据库记录。这可能会导致错误。
我从未使用过Fluent NHibernate,所以我不知道如何使用Fluent。

好的,我明白……但这会在某种程度上影响NHibernate映射?@aGuy我对NHibernate不太熟悉,但我很确定您可以创建到字段而不是属性的映射。原始示例在调用getter或setter时引发stackoverflow异常。我知道……但这会在某种程度上影响nHibernate映射?@aGuy我对nHibernate不太熟悉,但我相当确定您可以创建到字段而不是属性的映射