Для общесистемного соглашения я считаю, что это лучше всего послужит цели. (Я не был уверен, стоит ли включать весь текст или только часть здесь, так как я ответил на него здесь уже)
Вот решение со ссылками на текущую документацию по Fluent NHibernate & autopping.
Проблема (простой пример):
Допустим, у вас есть простой пример (из вики-администратора) с сущностью и ее объектами значений в списке:
public class Product
{
public virtual int Id { get; set; }
//..
public virtual Shelf { get; set; }
}
public class Shelf
{
public virtual int Id { get; set; }
public virtual IList<Product> Products { get; set; }
public Shelf()
{
Products = new List<Product>();
}
}
С таблицами, например,
Shelf
id int identity
Product
id int identity
shelfid int
и внешним ключом для Shelid -> Shelf.Id
Вы получите сообщение об ошибке: неверное имя столбца ... shelf_id
Решение:
Добавьте соглашение, оно может быть системным или более ограниченным.
ForeignKey.EndsWith("Id")
Пример кода:
var cfg = new StoreConfiguration();
var sessionFactory = Fluently.Configure()
.Database(/* database config */)
.Mappings(m =>
m.AutoMappings.Add(
AutoMap.AssemblyOf<Product>(cfg)
.Conventions.Setup(c =>
{
c.Add(ForeignKey.EndsWith("Id"));
}
)
.BuildSessionFactory();
Теперь он будет автоматически преобразовывать столбец ShelfId
в свойство Shelf
в Product
.
Подробнее
Wiki для автоматического сопоставления
Table.Is(x => x.EntityType.Name + "Table")
PrimaryKey.Name.Is(x => "ID")
AutoImport.Never()
DefaultAccess.Field()
DefaultCascade.All()
DefaultLazy.Always()
DynamicInsert.AlwaysTrue()
DynamicUpdate.AlwaysTrue()
OptimisticLock.Is(x => x.Dirty())
Cache.Is(x => x.AsReadOnly())
ForeignKey.EndsWith("ID")
Подробнее о соглашениях об автоматическом использовании Fluent NHibernate