2009-08-17 2 views
4

Как я могу указать с плавным отображением NHibernate для таблицы, у которой нет столбца идентификации?Fluent nHibernate no identity column в таблице

Я хочу что-то вроде этого:

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

0

Я обнаружил, что явно задать имя столбца в подобном случае. Что-то вроде

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

Это не отвечает непосредственно на вопрос .. но ответ на этот вопрос в комментарии к принятому здесь отвечу.

У нас была та же проблема с SQL View над нашей книгой. Проблема в том, что NHibernate будет с удовольствием дублировать строки, если свойство Id не уникально. В нашем случае .. у нас были записи Ledger, в которых CustomerAccountId был установлен как Id .. который не был уникальным в представлении. Чтобы обойти это, я сопоставил CompositeId, который был основан на том, что я мог найти, что сделало строку уникальной. В нашем случае это была комбинация CustomerAccountId и WeekEnding:

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

Этого было достаточно, чтобы NHibernate не карта дубликатов.

Смежные вопросы