2012-03-13 49 views
5

我正在使用字符串作爲主鍵的brownfield數據庫。 使用Fluent NHibernateSqlite(內存提供程序單元測試)和SQL Server 2005如何使用字符串鍵(流利)NHibernate

我有以下實體:

public class Entity 
{ 
    public virtual DateTime TimeStamp { get; set; } 

    public virtual string Name { get; set; } 
} 

有了這個映射:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Map(_ => _.TimeStamp); 
     Id(_ => _.Name).CustomType("AnsiString"); 
    } 
} 

但是它不工作說NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

如何使這項工作?另外,有沒有關於流利nhibernate可用的良好文檔?

在此先感謝。

+0

THX的鏈接,但他們既不是新的我,也不包括有關我的問題什麼:)我是不是能夠找到的有關字符串鍵什麼那裏。另外我想從明確的映射開始。 – 2012-03-14 00:07:16

+0

這是在這個鏈接http://stackoverflow.com/questions/411825/nhibernate-with-string-primary-key-and-relationships – 2012-03-14 00:17:32

+0

@krystanhonour不完全。這個問題也沒有被接受的答案。如果你能認識到答案,那麼你可以在這裏重新發布它並獲得投票和我的讚賞?謝謝。 – 2012-03-14 00:31:20

回答

12

如果使用字符串作爲主鍵,你可能會不得不做這樣的事情:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Id(x => x.Name).GeneratedBy.Assigned(); 
     Map(x => x.TimeStamp); 
    } 
} 

從NHibernate的文檔:

5.1.4.7。已分配的標識符

如果您希望應用程序分配標識符(與NHibernate生成它們的 相反),您可以使用分配的生成器。 這個特殊的生成器將使用已經分配給對象的標識符屬性的標識符值 。使用此功能時,請務必非常小心,以分配具有商業含義的鍵(幾乎總是一個可怕的 設計決策)。

由於其固有特性,使用此生成器的實體不能通過ISession的SaveOrUpdate()方法保存爲 。相反,如果需要保存對象或者通過調用 ISession的Save()或Update()方法更新 ,則必須明確指定給NHibernate。

另外這裏是一篇相關的文章。這是有點過時,但仍適用於您的情況:

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8