流畅的NHibernate复合映射

时间:2013-04-11 17:14:20

标签: nhibernate fluent fluent-nhibernate-mapping composite-key

我正在尝试映射两个表:

  • 第一个具有id(idA)和具有另一个表的id(idB)的字段。
    • 另一个具有基于先前id(idB)的复合键和另一个(idB2)

这个想法是第二个表包含多行A拆分的描述。

我当前的实现如下,但我无法检索连接所需的partialDescription。 我应该如何更改我的映射工作?有任何想法吗? :)

public class A
{
    long idA
    lond idB
    string fullDescription
}


public class B
{
    long idB
    long idB2
    strind partialDescription
}   

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Table("A");
        Id(x => x.id).Column("idA").GeneratedBy.Native();
        Map(x => x.idB).Column("idB")
        HasMany(x => x.B).KeyColumn("idB").Inverse().Cascade.All().Not.LazyLoad();
    }
}

 public class BMap : ClassMap<B>
{
    public BMap()
    {
        Table("B");
        CompositeId()
            .KeyReference(x => x.A, "idB")
            .KeyProperty(x => x.idB2, "idB2");
        Map(x => x.partialDescription, "desc").CustomType("AnsiString");
    }
}

1 个答案:

答案 0 :(得分:1)

事实上,根据您的描述,您必须拥有另一个场景:

public class A
{   
    public virtual long Id { get; set; }
    public virtual IList<B> PartialDescriptions { get; protected set; }
    public string fullDescription
    {
        get
        {
            StringBuilder description = new StringBuilder();
            foreach (var partial in PartialDescriptions)
            {
                description.Append(partial);
            }

            return description.ToString();
        }
    }
}

public class B
{
    public virtual long Id { get; set; }
    public virtual long Id2 { get; set; }
    public virtual string Description { get; set; }
}

然后,尝试实现这样的类映射:

public class BMap : ClassMap<B>
{
    public BMap()
    {
        Table("B");
        CompositeId()
            .KeyReference(x => x.Id, "idB")
            .KeyProperty(x => x.Id2, "idB2");
        Map(x => x.partialDescription, "desc").CustomType("AnsiString");
    }
}

public class AMap : ClassMap<A>
{
    public AMap()
    {
        Table("A");
        Id(x => x.Dd).Column("idA").GeneratedBy.Native();
        HasMany(x => x.PartialDescriptions)
            .KeyColumn("idB")
            .Inverse()
            .Cascade.All()
            .Not.LazyLoad();
    }
}

注意:我没有尝试编译此代码。我只希望你能成为将军。

我建议您查看Fluent NHibernate的Getting started section以获取更多信息。