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