FluentNhibernate и ссылки

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

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

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

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

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

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

С уважением,

Альберто

1
задан LeftyX 16 August 2010 в 12:32
поделиться

2 ответа

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

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

2
ответ дан 2 September 2019 в 22:08
поделиться

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

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
    }
}

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

0
ответ дан 2 September 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: