Установить идентичность семян в fluentnhibernate - PullRequest
0 голосов
/ 03 сентября 2011

Используя 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)"); Я получаю эту ошибку: у сущности «Клиент» нет сопоставленного идентификатора. Используйте метод Id для сопоставления вашего свойства идентичности. Например: Id (x => x.Id).

Когда я делаю это: Id(x => x.Id).Column("CustomerId").CustomSqlType("int IDENTITY(1,1000)"); Я получаю эту ошибку: для столбца CustomerId указано несколько ограничений IDENTITY столбца, таблица «Customer»

Использование FluentNHibernate 1.2.0.712.

Ответы [ 2 ]

0 голосов
/ 28 июня 2012

В приведенной ниже ссылке есть статья о реализации пользовательского генератора идентификаторов (см .: Часть 1: Наследование от класса TableGenerator ), но в примере выдается исключение для базы данных SQLite ( "Ошибка SQLite отсутствует такая таблица: hibernate_unique_key "). Таким образом, в отношении SQLite нет возможности получить текущий ключ идентификатора из таблицы. Он использует класс TableGenerator от NHibernate API (NHibernate.Id);

http://nhforge.org/wikis/howtonh/creating-a-custom-id-generator-for-nhibernate.aspx

Чтобы избежать исключения, я реализовал другое решение (особенно способ получения текущего идентификатора). Он использует преимущества 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 и включает в себя пользовательское начальное число идентификаторов.

С уважением Бронек

0 голосов
/ 03 сентября 2011

Я смог продублировать этот XML, выполнив что-то вроде этого:

Map(x => x.LoginName, "Column1").CustomSqlType("int IDENTITY(1,1000)");

Edit:

Если вы не можете достичь того, чего хотите, возможно, вам следует явно отобразить это, используя xml на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...