使用NHibernate,你可以像这样设置一个身份种子:
<column name="Column1" not-null="true" sql-type="int IDENTITY(1,1000)"/>
FluentNHibernate IdentityPart有CustomType和SqlCustomType方法,但对我来说也没有。有没有办法流利地设置身份种子?
更多信息:
当我这样做时:Map(x => x.Id).Column("CustomerId").CustomSqlType("int IDENTITY(1,1000)");
我收到此错误:实体'Customer'没有Id映射。使用Id方法映射您的标识属性。例如:Id(x =&gt; x.Id)。
当我这样做时:Id(x => x.Id).Column("CustomerId").CustomSqlType("int IDENTITY(1,1000)");
我收到此错误:为'CustomerId'列指定了多个列IDENTITY约束,表'Customer'
使用FluentNHibernate 1.2.0.712。
答案 0 :(得分:0)
我能够通过这样的方式复制那个xml:
Map(x => x.LoginName, "Column1").CustomSqlType("int IDENTITY(1,1000)");
如果你无法达到你想要的效果,你现在应该使用 xml 明确地映射它。
答案 1 :(得分:0)
下面的链接中有关于实现自定义标识生成器的文章(请参阅:第1部分:继承自TableGenerator类),但该示例将抛出SQLite数据库的异常(“SQLite errorr”没有这样的表:hibernate_unique_key“)。因此,就SQLite而言,不可能从表中获得当前的id密钥。它使用来自NHibernate API(NHibernate.Id)的类 TableGenerator ;
http://nhforge.org/wikis/howtonh/creating-a-custom-id-generator-for-nhibernate.aspx
为了避免异常,我实现了另一种解决方案(特别是获取当前Id的方式)。它利用了Fluent-NHibernate API( GeneratedBy.Custom())。请查看以下源代码:
public class MyAutoincrement<T> : IIdentifierGenerator where T : IId
{
#region IIdentifierGenerator Members
public object Generate(ISessionImplementor session, object obj)
{
NHibernate.ISession s = (NHibernate.ISession)session;
int seedValue = 1000;
int maxId = -1;//start autoincrement from zero! (fluent nhibernate start from 1 as default)
List<T> recs = s.Query<T>().ToList<T>();
if (recs.Count > 0)
{
maxId = recs.Max(x => x.getId());
}
return seedValue + maxId + 1;
}
#endregion
}
//Interface for access to current Id of table
public interface IId
{
int getId();
}
//Entity
public class MyEntity : IId
{
public virtual int Id { get; protected set; }
public virtual string MyField1 { get; set; }
public virtual string MyField2 { get; set; }
#region IId Members
public virtual int getId()
{
return this.Id;
}
#endregion
}
//Entity Mapping
public class MyEntityMap : ClassMap<MyEntity>
{
public MyEntityMap()
{
Id(x => x.Id).GeneratedBy.Custom<MyAutoincrement<MyEntity>>();
Map(x => x.MyField1);
Map(x => x.MyField1);
}
}
它适用于SQLite数据库并涉及自定义标识种子。
此致 布罗尼斯瓦夫