FluentNHibernate:如何将HasMany(x => x.Addresses).KeyColumn("PersonId")转换为自动化

1 nhibernate fluent-nhibernate automapping

说我有这些模型:

public class Person
{
    public virtual int Id { get; private set; }
    public virtual ICollection<Address> Addresses { get; private set; }
}

public class Address
{
    public virtual int Id { get; private set; }
    public virtual Person Person { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望FluentNHibernate创建以下表:

Person
    PersonId
Address
    AddressId
    PersonId
Run Code Online (Sandbox Code Playgroud)

这可以通过使用流畅的映射轻松实现:

public class PersonMapping : ClassMap<Person>
{
    public PersonMapping()
    {
        Id(x => x.Id).Column("PersonId");
        HasMany(x => x.Addresses).KeyColumn("PersonId");
    }
}

public class AddressMapping : ClassMap<Address>
{
    public AddressMapping()
    {
        Id(x => x.Id).Column("AddressId");
        References(x => x.Person).Column("PersonId");
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过使用自动映射获得相同的结果.我尝试了以下约定:

class PrimaryKeyNameConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        instance.Column(instance.EntityType.Name + "Id");
    }
}

class ReferenceNameConvention : IReferenceConvention
{
    public void Apply(IManyToOneInstance instance)
    {
        instance.Column(string.Format("{0}Id", instance.Name));
    }
}
Run Code Online (Sandbox Code Playgroud)

但我遗憾地发现它创建了以下表格:

Person
    PersonId
Address
    AddressId
    PersonId
    Person_id // this column should not exist
Run Code Online (Sandbox Code Playgroud)

以下是我的其余代码:

ISessionFactory sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString))
    .Mappings(m =>
                m.AutoMappings.Add(AutoMap.Assemblies(typeof(Person).Assembly)
                    .Conventions.Add(typeof(PrimaryKeyNameConvention))
                    .Conventions.Add(typeof(ReferenceNameConvention)))

                //m.FluentMappings
                //    .Add(typeof (PersonMapping))
                //    .Add(typeof (AddressMapping))
    )
    .ExposeConfiguration(BuildSchema)
    .BuildConfiguration()
    .BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

Fou*_*rth 5

您需要一个外键约定:

public class SimpleForeignKeyConvention : ForeignKeyConvention
    {
        protected override string GetKeyName(Member property, Type type)
        {
            if(property == null)
                return type.Name + "Id";
            return property.Name + "Id";
        }
    }
Run Code Online (Sandbox Code Playgroud)

此外,您的参考约定应该更像是:

instance.Column(instance.Property.Name + "Id");
Run Code Online (Sandbox Code Playgroud)