0

私はVS2010を使用していますNHibernate 3.1.0.4000fluent Nhibernate 1.2.0.712.

私のプログラムには、次のクラス階層が含まれています。

public abstract class Stop
{  
}

public abstract class WorkStop : Stop
{
}

public class PatientStop : WorkStop
{
}

public class DoctorStop : WorkStop
{
}

public class HubStop : Stop
{
}

私のマッピングのオーバーライドは次のとおりです。

 public class StopMappingOverride : IAutoMappingOverride<Stop>
{
    public void Override(AutoMapping<Stop> mapping)
    {
        mapping.DiscriminateSubClassesOnColumn("StopType");
        mapping.SubClass<HubStop>("HubStop");
        mapping.SubClass<WorkStop>("WorkStop").Abstract();
        mapping.References(x => x.Planning).Cascade.None();
    }
}

public class WorkStopMappingOverride : IAutoMappingOverride<WorkStop>
{
    public void Override(AutoMapping<WorkStop> mapping)
    {
        //mapping.Table("Stop");
        mapping.DiscriminateSubClassesOnColumn("StopType");
        mapping.SubClass<DoctorStop>("DoctorStop");
        mapping.SubClass<PatientStop>("PatientStop");
        mapping.HasMany(d => d.Tasks).KeyColumn("StopId")
            .AsSet()
            .Access.CamelCaseField(Prefix.Underscore);

        mapping.References(x => x.Doctor).Cascade.None();
    }
}

public class DoctorStopMappingOverride : IAutoMappingOverride<DoctorStop>
{
    public void Override(AutoMapping<DoctorStop> mapping)
    {
        mapping.References(x => x.Practice).Cascade.None();
        mapping.HasMany(d => d.Protocols).KeyColumn("StopId")
            .AsSet()
            .Access.CamelCaseField(Prefix.Underscore);
        mapping.HasMany(d => d.Materials).KeyColumn("StopId")
            .AsSet()
            .Access.CamelCaseField(Prefix.Underscore);
    }
}
public class PatientStopMappingOverride : IAutoMappingOverride<PatientStop>
{
    public void Override(AutoMapping<PatientStop> mapping)
    {
        mapping.References(x => x.Patient).Cascade.None();
    }
}

public class HubStopMappingOverride : IAutoMappingOverride<HubStop>
{
    public void Override(AutoMapping<HubStop> mapping)
    {
    }
}

上記は以前のプロジェクトで機能していました。ワークストップである余分なレベルの抽象化を除いて、それは新しいものです。ただし、以下に示すように、ハブストップは引き続き機能するはずです。

マッピングのオーバーライドをそのまま使用すると、次のエラーが表示されます。 System.Data.SqlClient.SqlException : Invalid object name 'WORKSTOP'

だから私は、テーブル名を指定するとどうなるかと思いました.はい、ワークストップのマッピングオーバーライドにより、ディスクリミネーターが正しく入力され、医師と患者の停止を永続化できます.

しかし、その後、エラーが発生します: System.Data.SqlClient.SqlException : Invalid object name 'HUBSTOP'

もう一度テーブル名を使用しましたが、次のエラーが発生しました。 Cannot insert the value NULL into column 'StopType'

そもそも、ストップ マッピング オーバーライドでテーブル ディスクリミネータが機能しないのはなぜですか?

4

1 に答える 1

0

上書きしてみる

public class AutomappingConfiguration : DefaultAutomappingConfiguration
{
    public override bool IsDiscriminated(System.Type type)
    {
        var types = new System.Type[] { typeof(Stop), typeof(WorkStop) };
        return base.IsDiscriminated(type) || types.Contains(type);
    }
于 2013-07-23T07:24:01.167 に答える