FluentNhibernate и Ссылки - PullRequest
       29

FluentNhibernate и Ссылки

1 голос
/ 16 августа 2010

Я пытался изменить соглашение, чтобы мои идентификаторы следовали этому простому правилу: ProductCode , CustomerCode , OrderCode и т. Д. И т. Д.Я нашел простой способ сделать это, добавив соглашение:

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

Теперь я получил то, что хотел, но похоже, что FluentNhibernate отказывается применять то же правило со столбцом, ссылающимся на мои первичные ключи.Пример: моя таблица Customer будет иметь PK с именем CustomerCode , но моя таблица Order будет иметь справочный столбец с именем Customer_Id .Я пробовал разные способы переименовать столбец Customer_Id в CustomerCode (таблица Order ), но кажется, что ничего не работает должным образом.Единственное решение, которое работает, - это добавление соглашения, подобного этому:

public class ReferenceConvention : IReferenceConvention
        {
            public void Apply(FluentNHibernate.Conventions.Instances.IManyToOneInstance instance)
            {
                instance.Column(instance.Property.PropertyType.Name + "Code");
            }
        }

, но теперь FluentNhibernate создает два столбца, которые ссылаются на мой первичный ключ: CostumerCode и Customer_Id .

Я не могу понять, что я делаю неправильно.Любая помощь будет оценена.

С уважением,

Альберто

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Взгляните на ForeignKeyConvention базовый класс.

ForeignKeyConvention - это объединение нескольких других соглашений, позволяющих легко указать схему именования для всех внешних ключей в вашем домене. Это особенно полезно, потому что не все внешние ключи доступны одинаково, в зависимости от того, где они находятся; это соглашение сводит на нет необходимость знать о базовой структуре.

0 голосов
/ 17 августа 2010

Как предположил Джеймс, я теперь применил эти два соглашения:

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

public class CustomForeignKeyConvention : ForeignKeyConvention
{
    protected override string GetKeyName(Member property, Type type)
    {
        if (property == null)
            return (type.Name + "Code");    // many-to-many, one-to-many, join

        return (property.Name + "Code");    // many-to-one
    }
}

и все отлично работает.

...