Я пытаюсь использовать соглашение для сопоставления свойств 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;
}
}
}