【问题标题】:Fluent NHibernate Composite MappingFluent NHibernate 复合映射
【发布时间】:2013-04-04 00:12:32
【问题描述】:

我正在尝试映射两个表:

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

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

我当前的实现如下,但我无法检索连接所需的 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");
    }
}

【问题讨论】:

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


    【解决方案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 以了解更多信息。

    【讨论】:

    • 非常感谢!!我不得不稍微修改你的代码,但你的想法很棒。 :))
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 2013-01-07
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2011-06-18
    • 2012-04-03
    相关资源
    最近更新 更多