0

如果这是可为空和不可空数据库字段FluentNhibernate自定义主键自动映射 - (DIS)允许空值

硬编码映射的方式
// nullable 
Map(x => x.FirstName) 
    .Nullable(); 

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

它是如何与自动映射和公约做了什么?

此外,它不明显,但我需要它的目的是让nhibernate生成插入的SQL语句,而不使用主键字段。

例如: 如果我想数据库生成产品编号,而不是

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

NHibernate的应该产生

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

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

回答

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 
    } 
} 
0

设置生成数据库主键的响应能力,使用流利的nhibernate并不能解决您的问题?

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

     Map(x => x.Name).Nullable(); 
     ... 
    } 
} 
+0

我没有尽到明确的映射类,我想用自动映射来代替。我尝试使用GeneratedBy.Native()和Nullable()来实现IKeyPropertyConvention;但它不起作用。我应该使用另一个界面吗? – Sofija 2012-03-07 12:51:45

+0

更正了我尝试使用的界面,我使用了IIdConvention,而不是IKeyPropertyConvention。 – Sofija 2012-03-07 21:06:52