如果导航属性名称与属性类型不同,如何做NHibernate多对一/一对多外键?

时间:2013-03-02 22:53:03

标签: c# .net nhibernate fluent-nhibernate

我正在使用NHibernate / FluentNhibernate和AutoMapping配置,而且我遇到了某些关系的外键问题。特别是导航属性名称与其指向的类型名称不同的那些:

public class Country       
{
    public virtual string Code { get; set; }

    public virtual string Name { get; set; }

    public virtual Currency DefaultCurrency { get; set; }
}

public class Currency
{
    public virtual string Code { get; set; }

    public virtual decimal Rate { get; set; }

    public virtual IList<Country> Countries { get; set; }     
}

对于国家/地区实体,其中导航属性DefaultCurrency的名称与名称Currency类型不同。 NHibernate的自动化将猜测Country表将具有以下外键:

  • DefaultCurrency_id:对应Country.Currency

  • 的关系
  • Currency_id:对应Currency.Countries

  • 的关系

如何告诉自动化关系Currency.Countries可以用DefaultCurrency_id键表示,导致只有一个国外表的外键:

  • DefaultCurrency_id:对应Country.CurrencyCurrency.Countries
  • 的关系

1 个答案:

答案 0 :(得分:1)

您可以在映射中指定所需的任何列名。

供参考:

References(x => x.Foo, "MyFooId")

对于has-many:

HasMany(x => x.Foos)
    .KeyColumn("MyFooId")

对于多对多:

HasManyToMany(x => x.Foos)
    .ChildKeyColumn("MyFooId")
    .ParentKeyColumn("MyFooId")

您还可以使用约定,例如:

public class HasManyConventions : IHasManyConvention
{
    public void Apply(IOneToManyCollectionInstance target)
    {
        target.Key.Column(target.EntityType.Name + "Id");
    }
}