C# FluentNhibernate自定义主键自动映射-(dis)允许空值
如果这是可空和不可空数据库字段的硬编码映射方式C# FluentNhibernate自定义主键自动映射-(dis)允许空值,c#,fluent-nhibernate,conventions,automapping,convention-over-configur,C#,Fluent Nhibernate,Conventions,Automapping,Convention Over Configur,如果这是可空和不可空数据库字段的硬编码映射方式 // nullable Map(x => x.FirstName) .Nullable(); // not nullable Map(x => x.FirstName) .Not.Nullable(); 自动映射和约定是如何实现的 另外,这并不明显,但我需要它的目的是让nhibernate生成insert sql语句,而不使用主键字段 例如: 如果我希望数据库生成ProductId,而不是 insert into Produ
// 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在这里不应该是一个问题,因为客户端代码不应该关心数据库如何分配它。使用fluent nhibernate设置生成数据库主键的责任并不能解决您的问题
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.Name).Nullable();
...
}
}
公共类ProductMap:ClassMap
{
公共产品地图()
{
Id(x=>x.Id).GeneratedBy.Native();
Map(x=>x.Name).Nullable();
...
}
}
毕竟,解决方案在于实现IID转换接口。我正在添加一些代码,以防有人发现这很有用
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
}
}
我没有尝试显式映射类,我希望使用自动映射。我尝试使用GeneratedBy.Native()和Nullable()实现IKeyPropertyConvention;但它不起作用。我应该使用另一个接口吗?对我尝试使用的接口进行更正,我使用的是IIdConvention,而不是IKeyPropertyConvention。