2012-03-09 50 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 {...} 

无论如何,只是想我会带来不同的视角。