如果这是可空和非可空数据库字段的硬编码映射方式
// nullable
Map(x => x.FirstName)
.Nullable();
// not nullable
Map(x => x.FirstName)
.Not.Nullable();
自动化和约定如何完成?
此外,它并不明显,但我需要它的目的是让nhibernate生成insert sql语句而不使用主键字段。
实施例: 如果我希望数据库生成ProductId,而不是
insert into Product (ProductId, Name) values (1, 'product name');
NHibernate应该生成
insert into Product (Name) values ('product name');
而且,rdbms不应该是一个问题,因为客户端代码不应该关心数据库如何分配它。
答案 0 :(得分:2)
毕竟,解决方案是实现IIdConvention接口。我正在添加一些代码以防有人发现它有用。
public class PrimaryKeyConvention : IIdConvention
{
public void Apply(IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name + "Id");
instance.GeneratedBy.Native();
}
}
它甚至可以与自定义类一起用于生成id
public class PrimaryKeyConvention : FluentNHibernate.Conventions.IIdConvention
{
public void Apply(IIdentityInstance instance)
{
instance.Column(instance.EntityType.Name + "Id");
instance.GeneratedBy.Custom(typeof(CustomIdGenerator));
}
}
public class CustomIdGenerator : NHibernate.Id.IIdentifierGenerator
{
public object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
{
return null; //this should be custom implemented
}
}
答案 1 :(得分:0)
使用流畅的nhibernate设置生成数据库主键的职责并不能解决您的问题?
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Name).Nullable();
...
}
}