Я пытался изменить соглашение, чтобы мои идентификаторы следовали этому простому правилу: 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 .
Я не могу понять, что делаю неправильно. Любая помощь будет принята с благодарностью.
С уважением,
Альберто
Взгляните на базовый класс ForeignKeyConvention .
ForeignKeyConvention представляет собой объединение нескольких других соглашений, чтобы предоставить простой способ указать схему именования для всех внешних ключей в вашем домене. Это особенно полезно, потому что не все внешние ключи доступны одинаково, в зависимости от того, где они находятся; это соглашение отрицает необходимость знать о базовой структуре.
Как и предположил Джеймс, я применил эти два соглашения:
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
}
}
и все работает нормально.