Как создать / использовать соглашение Fluent NHibernate для автоматизации свойств UInt32 в базе данных SQL Server 2008? - PullRequest
1 голос
/ 13 мая 2010

Я пытаюсь использовать соглашение для сопоставления свойств UInt32 с базой данных SQL Server 2008. Мне кажется, что я не могу создать решение на основе существующих веб-источников из-за обновлений в том, как работает Fluent NHibernate, т.е. примеры устарели.

Я пытаюсь, чтобы NHibernate генерировал схему (через ExposeConfiguration). Я счастлив, что NHibernate сопоставляет это с чем-либо разумным (например, bigint).

Вот мой код в его нынешнем виде (который, когда я пытаюсь представить схему, завершается неудачей из-за того, что SQL Server не поддерживает UInt32). Извините за то, что код немного длинный, но я не уверен на 100%, что имеет отношение к проблеме, поэтому я ошибаюсь из-за осторожности. Большинство из них основано на этом посте .

Сообщение об ошибке:

System.ArgumentException : Dialect does not support DbType.UInt32

Думаю, мне понадобится сравнительно подробный пример, так как в настоящее время я не могу собрать все воедино в рабочее решение.

FluentConfiguration configuration =
    Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(connectionString))
        .Mappings(mapping =>
            mapping.AutoMappings.Add(
                AutoMap.AssemblyOf<Product>()
                    .Conventions.Add<UInt32UserTypeConvention>()));

configuration.ExposeConfiguration(x => new SchemaExport(x).Create(false, true));

namespace NHibernateTest
{
    public class UInt32UserTypeConvention : UserTypeConvention<UInt32UserType> 
    {
        // Empty.
    }
}

namespace NHibernateTest
{
    public class UInt32UserType : IUserType
    {
        // Public properties.

        public bool IsMutable
        {
            get
            {
                return false;
            }
        }

        public Type ReturnedType
        {
            get
            {
                return typeof(UInt32);
            }
        }

        public SqlType[] SqlTypes
        {
            get
            {
                return 
                    new SqlType[] 
                    { 
                        SqlTypeFactory.Int32 
                    };
            }
        }

        // Public methods.

        public object Assemble(object cached, object owner)
        {
            return cached;
        }

        public object DeepCopy(object value)
        {
            return value;
        }

        public object Disassemble(object value)
        {
            return value;
        }

        public new bool Equals(object x, object y)
        {
            return (x != null && x.Equals(y));
        }

        public int GetHashCode(object x)
        {
            return x.GetHashCode();
        }

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            int? i = (int?)NHibernateUtil.Int32.NullSafeGet(rs, names[0]);
            return (UInt32?)i;
        }

        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            UInt32? u = (UInt32?)value;
            int? i = (Int32?)u;
            NHibernateUtil.Int32.NullSafeSet(cmd, i, index);
        }

        public object Replace(object original, object target, object owner)
        {
            return original;
        }
    }
}

1 Ответ

0 голосов
/ 13 мая 2010

Конечно, вам необходимо сопоставить существующий тип данных SQL Server.

Исходя из этого вопроса, «Лучший способ хранить UInt32 на Sql Server» , ваш выбор:

  • тип данных CLR
  • bigint
  • decimal
  • Обходной путь, используя int.MinValue для сопоставления с int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...