0

如果这是可空和不可空数据库字段的硬编码映射方式

// nullable
Map(x => x.FirstName)
  .Nullable();

// not nullable
Map(x => x.FirstName)
  .Not.Nullable();

自动映射和约定是如何完成的?

此外,这并不明显,但我需要它的目的是让 nhibernate 在不使用主键字段的情况下生成插入 sql 语句。

示例:如果我希望数据库生成 ProductId,而不是

insert into Product (ProductId, Name) values (1, 'product name');

NHibernate 应该生成

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

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

4

2 回答 2

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
    }
}
于 2012-03-13T21:25:05.660 回答
0

设置生成数据库主键的责任,使用流利的nhibernate不能解决你的问题吗?

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id).GeneratedBy.Native();

        Map(x => x.Name).Nullable();
        ...
    }
}
于 2012-03-07T12:22:31.393 回答