Nhibernate - 如何使用CompositeId设计DomainObjects和Mappings

时间:2010-08-18 07:44:34

标签: c# nhibernate orm fluent-nhibernate nhibernate-mapping

起初我对ORM,nhibernate和FHN都很陌生。我现在看了几天这个东西。 我有一个包含4个表的现有数据库:

alt text

所以我首先尝试让Auswahl和RefAuswahlFilter工作。

这是我的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时,调试器显示以下错误:

innerException {“ORA-00904:\”REFFILTERS0 \“。\”AUSWAHL_ID \“:ungültigerBezeichner\ n”}

无法初始化集合:[ORMTest.DomainModel.Auswahl.RefFilters#1097] [SQL:SELECT reffilters0_.Auswahl_id as Auswahl4_1_,reffilters0_.IDAUSWAHL as IDAUSWAHL1_,reffilters0_.FILTERANK as FILTERANK1_,reffilters0_.IDAUSWAHL as IDAUSWAHL3_0_,reffilters0_。 FILTERANK为FILTERANK3_0_,reffilters0_.Filter为Filter3_0_ FROM REFAUSWAHLFILTER reffilters0_ WHERE reffilters0_.Auswahl_id =?]

所以我认为我的映射有些不对劲,但我真的不明白。

THX。

1 个答案:

答案 0 :(得分:2)

好吧,我部分成功了。从数据库读取工作现在。

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] DEBUG”来自哪里,但这是我到目前为止的例外。

14:31:18.397 [9] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - 插入实体:[ORMTest.DomainModel.RefAuswahlFilter#ORMTest.DomainModel.RefAuswahlFilter] 14:31:18.413 [9] DEBUG NHibernate.AdoNet.AbstractBatcher - 打开新的IDbCommand,打开IDbCommands:1 14:31:18.413 [9] DEBUG NHibernate.AdoNet.AbstractBatcher - 为SqlString构建一个IDbCommand对象:INSERT INTO REFAUSWAHLFILTER(Filter,IDAUSWAHL,Filterrank)VALUES(?,?,?) 14:31:18.413 [9] DEBUG NHibernate.Persister.Entity.AbstractEntityPersister - 脱水实体:[ORMTest.DomainModel.RefAuswahlFilter#ORMTest.DomainModel.RefAuswahlFilter] 14:31:18.413 [9] DEBUG NHibernate.Type.StringType - 将'fh'绑定到参数:0 14:31:18.413 [9] DEBUG NHibernate.Type.Int64Type - 将'1446'绑定到参数:1 14:31:18.413 [9] DEBUG NHibernate.Type.Int64Type - 将'1446'绑定到参数:2 14:31:18.413 [9] DEBUG NHibernate.Type.Int64Type - 将'1'绑定到参数:3 14:31:18.585 [9] DEBUG NHibernate.AdoNet.AbstractBatcher - 关闭IDbCommand,打开IDbCommands:0 14:31:18.647 [9] DEBUG NHibernate.AdoNet.ConnectionManager - 注册flush end

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

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

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

        Map(x => x.Filter);
    }

保存工作与预期一样。尽管如此,NHibernate Profiler会显示一些警告,而我对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 */