Fluent nhibernate 在fluentnhibernate中设置标识种子

Fluent nhibernate 在fluentnhibernate中设置标识种子,fluent-nhibernate,Fluent Nhibernate,使用NHibernate可以设置标识种子,如下所示: <column name="Column1" not-null="true" sql-type="int IDENTITY(1,1000)"/> FluentNHibernate IdentityPart有CustomType和SqlCustomType方法,但我也没有。有没有办法流利地设定身份种子 更多信息: 当我这样做时:Map(x=>x.Id).Column(“CustomerId”).CustomSqlType(

使用NHibernate可以设置标识种子,如下所示:

<column name="Column1" not-null="true" sql-type="int IDENTITY(1,1000)"/>

FluentNHibernate IdentityPart有CustomType和SqlCustomType方法,但我也没有。有没有办法流利地设定身份种子

更多信息:

当我这样做时:
Map(x=>x.Id).Column(“CustomerId”).CustomSqlType(“intidentity(11000)”
我得到这个错误:实体“Customer”没有映射的Id。使用Id方法映射标识属性。例如:Id(x=>x.Id)

当我这样做时:
Id(x=>x.Id).Column(“CustomerId”).CustomSqlType(“intidentity(11000)”
我得到这个错误:为列“CustomerId”和表“Customer”指定了多个列标识约束


使用FluentNHibernate 1.2.0.712.

我可以通过如下操作复制该xml:

Map(x => x.LoginName, "Column1").CustomSqlType("int IDENTITY(1,1000)");
编辑:
如果你不能实现你想要的,也许你现在应该使用xml显式地映射它。

下面的链接中有一篇关于实现自定义标识生成器的文章(请参阅:第1部分:从TableGenerator类继承),但是这个例子对SQLite数据库抛出了一个异常(“SQLite errorr没有这样的表:hibernate_unique_key”)。因此,对于SQLite,不可能从表中获取当前id键。它使用NHibernate API(NHibernate.id)提供的类TableGenerator

为了避免异常,我实现了另一个解决方案(特别是获取当前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);
    }
}
公共类MyAutoincrement:IIIdentifierGenerator其中T:IId
{
#区域II标识符生成器成员
公共对象生成(ISessionImplementor会话,对象obj)
{
NHibernate.isessions=(NHibernate.ISession)会话;
int-seedValue=1000;
int maxId=-1;//从零开始自动递增!(默认为从1开始)
List recs=s.Query().ToList();
如果(记录计数>0)
{
maxId=recs.Max(x=>x.getId());
}
返回seedValue+maxId+1;
}
#端区
}
//用于访问表的当前Id的接口
公共接口IId
{
int getId();
}
//实体
公共类MyEntity:IId
{
公共虚拟整数Id{get;protected set;}
公共虚拟字符串MyField1{get;set;}
公共虚拟字符串MyField2{get;set;}
#区域IId成员
公共虚拟int getId()
{
返回此.Id;
}
#端区
}
//实体映射
公共类MyEntityMap:ClassMap
{
公共MyEntityMap()
{
Id(x=>x.Id).GeneratedBy.Custom();
Map(x=>x.MyField1);
Map(x=>x.MyField1);
}
}
它与SQLite数据库一起工作,并涉及自定义标识种子

问候
Bronek

Thx,但它仍然不适合我。我已经为我的问题添加了更多的细节。关于xml映射,我更喜欢我目前的工作,将数据库作为sql构建脚本分发。但我会认为(其他方面很好)FluentNH必须足够成熟,以适应这种情况。这是一个edgecase,除非您导入了旧数据并希望从5000或更多开始插入,否则几乎没有任何情况需要设置种子。为什么需要设置种子?您应该避免允许数据库为您生成密钥,因为它需要循环trips检索id以更新模型和处理关系,同时中断批处理。但即使您允许DB生成密钥,为什么要更改种子?!对于开发1,1非常好,在生产中,您不应该允许NHibernate生成/更新数据库。@Phill您这么说是因为FluentNH不支持我的方案,那么这是一个无效的方案?不过谢谢你关于额外往返的提示。这在我的情况下不是问题,但还是很高兴知道。