流畅的nHibernate映射 - 1到0..1

时间:2013-09-19 14:00:08

标签: c# nhibernate fluent-nhibernate

我有两张桌子:

   TableA (Id, Name, UpdateDate)
   TableB (Id, TableAId, Amount)

我的域对象如下所示:

   TableA
     public virtual Guid Id {get;set;}
     public virtual String Name {get;set;}
     public virtual TableB TableB {get; set;}

   TableB
     public virtual Guid Id {get;set;}
     public virtual decimal Amount {get;set;}
     public virtual TableA TableA {get;set;}

我如何映射这些表,以便每当我查询TableA时,如果有TableB,我会在 Component(x => x.TableB, m => m.References(x => x.TableA).Column("TableAId").Nullable()); 中获得它的引用?

在我的TableA映射中:

{{1}}

3 个答案:

答案 0 :(得分:0)

我认为这更合适

public virtual IList<TableB> TableB { get; set; }

因为TableB中的许多项可以引用TableA中的相同项。 对于映射,这应该工作:

public TableAMapping : ClassMap<TableA>
{
    public TableAMapping()
    {
        // other struff
        HasMany(x => x.TableB).Table("TableB").KeyColumn("TableAId");
    }
}

对于TableB

public TableBMapping : ClassMap<TableB>
{
    public TableBMapping()
    {
        // other struff
        Reference(x => x.TableA)Column("TableAId");
    }
}

<强>更新

1对1

HasOne(x => x.TableB).ForeignKey("TableAId");

答案 1 :(得分:0)

如果您使用Fluen Mapping,可以尝试这样:

public TableAMap()
{
    Table("TableA");

    Id(x=> x.Id).GeneratedBy.Assigned();
    Map(x=> x.Name).Not.Nullable();

    References(x => x.TableB, TableBId);
}

public TableBMap()
{       
    Table("TableB");

    Id(x=> x.Id).GeneratedBy.Assigned();
    Map(x=> x.Amount).Not.Nullable();

    HasMany<TableA>(x => x.TableA)
    .Nullable()
    .KeyColumn("TableAId");
}

如果您想确保它是1比1,您可以使用“HasOne”代替参考文献。

答案 2 :(得分:0)

我想出了答案。使用我在问题中列出的确切模式,我能够像这样将TableA映射到TableB。

HasOne(x => x.TableB).PropertyRef(m => m.TableA).Cascade.All();