FluentNhibernate自定义主键自动映射 - (dis)允许空值

时间:2012-03-05 22:46:15

标签: 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 Product (ProductId, Name) values (1, 'product name');

NHibernate应该生成

insert into Product (Name) values ('product name');

而且,rdbms不应该是一个问题,因为客户端代码不应该关心数据库如何分配它。

2 个答案:

答案 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();
        ...
    }
}