C# Nhibernate-如何使用CompositeId设计域对象和映射

C# Nhibernate-如何使用CompositeId设计域对象和映射,c#,nhibernate,orm,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Orm,Fluent Nhibernate,Nhibernate Mapping,一开始我对ORM、nhibernate和FHN都很陌生。我已经研究了几天了。 我有一个包含4个表的现有数据库: 所以我首先尝试让Auswahl和Refauswahl过滤器工作 以下是我的DomainObjects:请告诉我何时可以做得更好 [Serializable] public class Auswahl { public Auswahl() { this.RefFilters = new List<RefAuswahlFilter>();

一开始我对ORM、nhibernate和FHN都很陌生。我已经研究了几天了。 我有一个包含4个表的现有数据库:

所以我首先尝试让Auswahl和Refauswahl过滤器工作

以下是我的DomainObjects:请告诉我何时可以做得更好

[Serializable]
public class Auswahl
{
    public Auswahl()
    {
        this.RefFilters = new List<RefAuswahlFilter>();
    }

    public virtual IList<RefAuswahlFilter> RefFilters { get; set; }

    //...rest of the Properties

[Serializable]
public class RefAuswahlFilter
{
    public virtual Auswahl Auswahl { get; set; }
    public virtual long Filterrank { get; set; }
    public virtual string Filter { get; set; }
以下是我的映射:

public class AuswahlMap : ClassMap<Auswahl>
{
    public AuswahlMap()
    {
        Table("AUSWAHL");

        Id(x => x.Id)
            .GeneratedBy.Sequence("SEQ_AUSWAHL");

        Map(x => x.Programm);
        Map(x => x.Variante);
        Map(x => x.Returnkey);
        Map(x => x.Beschreibung);

        HasMany<RefAuswahlFilter>(x => x.RefFilters);

    }
}

public class RefAuswahlFilterMap : ClassMap<RefAuswahlFilter>
{
    public RefAuswahlFilterMap()
    {
        Table("REFAUSWAHLFILTER");

        CompositeId()
            .KeyReference(x => x.Auswahl,"IDAUSWAHL")
            .KeyProperty(x => x.Filterrank,"FILTERANK");

        Map(x => x.Filter);
    }
}
如果我运行我的应用程序,我会得到一个包含所有Auswahl行的列表

var l = session.CreateCriteria(typeof(Auswahl)).List<Auswahl>();
但当我查看某个项以获取RefFilters时,调试器显示以下错误:

内部异常{ORA-00904:\REFFILTERS0\.\AUSWAHL\u ID\:ungültiger Bezeichner\n}

无法初始化集合:[ORMTest.DomainModel.Auswahl.RefFilters1097][SQL:选择reffilters0.Auswahl_id作为Auswahl 4_1_,reffilters0.IDAUSWAHL作为IDAUSWAHL 1_,reffilters0.FILTERANK作为FILTERANK 1_,reffilters0_.IDAUSWAHL作为IDAUSWAHL 3_0_,reffilters0_.FILTERANK作为FILTERANK 3_0_,reffilters0.Filters0作为Filter3_0_从RefFilterswahl Filters0_0中选择reffilters0.Auswahl=?]

所以我认为我的地图有问题,但我真的不明白


thx.

我取得了部分成功。从数据库中读取数据现在可以工作了

public AuswahlMap()
    {
        Table("AUSWAHL");

        Id(x => x.Id,"ID")
            .GeneratedBy.Sequence("SEQ_AUSWAHL");

        Map(x => x.Programm);
        Map(x => x.Variante);
        Map(x => x.Returnkey).Not.Nullable();
        Map(x => x.Beschreibung);

        HasMany(x => x.RefFilters)
            .Inverse()
            .Cascade.All();    
    }

public RefAuswahlFilterMap()
    {
        Table("REFAUSWAHLFILTER");

        CompositeId()
            .KeyReference(x => x.Auswahl,"IDAUSWAHL")
            .KeyProperty(x => x.Filterrank);

        Map(x => x.Filter);

        References(x => x.Auswahl)
            .Column("IDAUSWAHL")
            .Not.Nullable();
    }
到目前为止,保存到DB只适用于空列表RefFilters,因此我现在必须对此进行研究。这是我的日志。我真的不知道NHibernate.Type.Int64Type-将“1”绑定到参数:3 14:31:18.585[9]的调试来自何处,但到目前为止,这是一个例外

14:31:18.397[9]调试NHibernate.Persister.Entity.AbstractEntityTyperMaster-插入实体:[ORMTest.DomainModel.RefAuswahlFilterORMTest.DomainModel.RefAuswahlFilter] 14:31:18.413[9]调试NHibernate.AdoNet.AbstractBatcher-打开新IDbCommand,打开IDbCommands:1 14:31:18.413[9]调试NHibernate.AdoNet.AbstractBatcher-为SqlString构建IDbCommand对象:插入到REFAUSWAHLFILTER筛选器中,IDAUSWAHL,Filterrank值? 14:31:18.413[9]调试NHibernate.Persister.Entity.AbstractEntityPersister-脱水实体:[ORMTest.DomainModel.RefAuswahlFilterORMTest.DomainModel.RefAuswahlFilter] 14:31:18.413[9]调试NHibernate.Type.StringType-将“fh”绑定到参数:0 14:31:18.413[9]调试NHibernate.Type.Int64Type-将“1446”绑定到参数:1 14:31:18.413[9]调试NHibernate.Type.Int64Type-将“1446”绑定到参数:2 14:31:18.413[9]调试NHibernate.Type.Int64Type-将“1”绑定到参数:3 14:31:18.585[9]调试NHibernate.AdoNet.AbstractBatcher-关闭IDB命令,打开IDB命令:0 14:31:18.647[9]调试NHibernate.AdoNet.ConnectionManager-注册刷新结束

编辑: 如果我将映射更改为

public RefAuswahlFilterMap()
    {
        Table("REFAUSWAHLFILTER");

        CompositeId()
            .KeyReference(x => x.Auswahl,"IDAUSWAHL")
            .KeyProperty(x => x.Filterrank);

        Map(x => x.Filter);
    }
保存工作与预期一样。尽管NHibernate探查器显示了一些警告,但我的RefAuswahlFilter选择看起来不太好:

SELECT reffilters0_.IDAUSWAHL  as IDAUSWAHL1_,
       reffilters0_.Filterrank as Filterrank1_,
       reffilters0_.IDAUSWAHL  as IDAUSWAHL3_0_,
       reffilters0_.Filterrank as Filterrank3_0_,
       reffilters0_.Filter     as Filter3_0_
FROM   REFAUSWAHLFILTER reffilters0_
WHERE  reffilters0_.IDAUSWAHL = 1 /* :p0 */
尝试从HasMany.HasManyx=>x.RefFilters中删除;不确定语法是否仍然有效。