在fluentnhibernate中设置标识种子

时间:2011-09-02 20:01:16

标签: 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("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。

2 个答案:

答案 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数据库并涉及自定义标识种子。

此致 布罗尼斯瓦夫