2012-03-09 70 views
1

我有FluentNHibernate中的域名對象的類型爲object的Id將永遠是int(推理如下)。現在我有一個SQLite後端。我想將Id作爲自動增量進行映射。到目前爲止,我有:作爲int idententity映射對象ID

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Table("Users"); 
     Id(x => x.Id).CustomType<int>().GeneratedBy.Native(); 
     Map(x => x.Email); 
    } 
} 

public class User 
{ 
    public virtual object Id { get; set; } 
    public virtual string Email { get; set; } 
} 

但在加載地圖時,它拋出與爲User.Id屬性(堆棧跟蹤信息Identity type must be integral (int, long, uint, ulong)一個FluentConfigurationException當我打電話Native說,它發生再次,我真的只是想自動。 -Increment整數。

推理對象ID

我們有業務需求,支持多種RDBMS的,以及MongoDB的。我已經清楚地意識到,這是一個壞主意,所以,請FO關於這個問題。 Mongo使用ObjectId(Guid類似的連續值類型),因爲它是默認的ID類型。這個想法是隱藏實際的ID類型(因爲它依賴於數據層),但重用模型並有兩種不同的數據訪問實現(Mongo & NHibernate)。

回答

3

我結束了做

Id(x => x.Id).CustomType<int>() 
    .GeneratedBy.Custom<global::NHibernate.Id.IdentityGenerator>() 
    .UnsavedValue(null); 

出於某種原因,解決這個問題,功能NHibernate不明白,.CustomType<int>()意味着它真的是一個int。所以我不得不添加自定義生成器來繞過Fluent的邏輯。

這解決了眼前的問題,但我仍然需要弄清楚如何收集&外鍵需要工作。

0

相反的CustomType<int>,嘗試CustomType<NHibernate.Type.Int32Type>

如果這不起作用,你可以刪除ID屬性,只有在NHibernate的映射。這確實有一些編程問題(基本上,你必須調用NHibernate來獲得一個實體的Id),但它會起作用。

我不確定Fluent是否支持這個;我敢肯定,XML確實並且幾乎可以肯定,MappingByCode也是如此。

+0

不,同樣的錯誤 – kelloti 2012-03-09 15:24:07

+0

你是什麼意思「刪除Id屬性」?我仍然需要一個Id,但它不必擁有一個公共getter ... – kelloti 2012-03-09 16:01:23

+1

我現在有'Id(x => x.Id).CustomType ().GeneratedBy.Custom ()'它已經越過了以前的錯誤。改爲使用'StaleStateException':「行已被另一個事務更新或刪除(或未保存的值映射不正確)」。爲什麼它試圖「更新」而不是「插入」? – kelloti 2012-03-09 16:38:10

1

這裏是一個不同的想法在一起。

而不是有一個實體表示兩個數據庫系統都具有從相同的合同繼承的單獨的實體。這樣,您可以根據合同進行編程,然後在數據訪問層中決定要保存哪種實體類型。

public interface IUser 
{ 
    dynamic Id {get;set;} 
    string Email {get;set;} 
} 

public class MongoUser : IUser{...} 

public class SqlUser : IUser {...} 

無論如何,只是想我會帶來不同的視角。