2009-08-17 46 views
4

我如何使用流畅的NHibernate映射为没有标识列的表指定?流利的nHibernate没有表中的标识列

我想是这样的:

public sealed class CustomerNewMap : ClassMap<CustomerNew>, IMap 
{ 
    public CustomerNewMap() 
    { 
     WithTable("customers_NEW"); 
     Not.LazyLoad(); 
     Not.Id(); // this is invalid... 
     Map(x => x.Username); 
     Map(x => x.Company); 
    } 
} 

我的意思是在数据库中没有定义主键(不要太多在数据库中定义)。

回答

8

我找到了答案是:

public CustomerNewMap() 
    { 
     WithTable("customers_NEW"); 
     Not.LazyLoad(); 
     Id(x => x.Username).GeneratedBy.Assigned(); 
     Map(x => x.Company); 
    } 
+4

如果我尝试使用相同键(在您的示例x​​.Username中)的所有对象实际上是从数据库中检索到的第一个对象的副本。 – blindmeis 2010-09-13 11:27:29

0

我发现我已经在类似的情况下,明确设定列名。就像

Id(x => x.Username).Column("Username").GeneratedBy.Assigned(); 
2

这并不直接回答这个问题..但它回答了这个问题在评论中被接受的答案在这里。

我们在SQL视图上存在与我们分类帐相同的问题。问题是,当Id属性不唯一时,NHibernate会很高兴地复制行。在我们的例子中,我们有总帐条目CustomerAccountId设为Id ..这在视图中并不是唯一的。 为了解决这个问题..我映射了一个CompositeId,它基于任何我能找到的使该行独一无二的东西。在我们的例子中,它是的CustomerAccountIdWeekEnding组合:

CompositeId() 
    .KeyProperty(x => x.CustomerAccountId) 
    .KeyProperty(x => x.WeekEnding); 

这是足有NHibernate的不重复的映射。