gpt4 book ai didi

nhibernate - 是否有任何编程方法来注入(inject) nhibernate UserTypes?

转载 作者:行者123 更新时间:2023-12-03 17:11:09 30 4
gpt4 key购买 nike

我有一个使用 Nhibernate 和 Microsoft Sql Server 开发的应用程序,但现在我正在尝试将它迁移到 SQLite。我发现了 SQLite 的一个问题,它没有给我合适的定点数字格式和货币值的准确算术。因此,为了解决这个问题,我模拟了编写自定义 IResultTransformer 和 UserType (FixedPointDecimalUserType) 的定点行为。另外,我想在应用程序之间共享映射。

我有一个扩展,可以将我的 UserType 注入(inject)类型为小数的属性和组件映射

<property name="Quantity" not-null="true" type="Decimal(8,3)"/>

我的扩展是这样的:

public static class NHExtensions
{

public static NHibernate.Cfg.Configuration AdaptToSQLite(this NHibernate.Cfg.Configuration configuration)
{
if (configuration.ClassMappings.Count == 0)
throw new InvalidOperationException("Es necesario añadir el assembly al configuration antes de llamar a este método");

if (configuration.Properties[NHibernate.Cfg.Environment.Dialect].IsIn(typeof(SQLiteDialect).FullName, typeof(SQLiteDialect).AssemblyQualifiedName))
{
foreach (var mapping in configuration.ClassMappings)
foreach (var property in mapping.PropertyIterator)
AdaptProperty(property);

foreach (var mapping in configuration.CollectionMappings)
How to get inject FixedPointUserType?

}
return configuration;
}

public static void AdaptProperty(Property property)
{
if (property.IsComposite)
{
var component = property.Value as Component;
component.PropertyIterator.Each(AdaptProperty);
}

if (property.Type.GetType() == typeof(DecimalType))
{
var simpleValue = property.Value as SimpleValue;
if (simpleValue != null)
simpleValue.TypeName = typeof(FixedPointDecimalUserType).AssemblyQualifiedName;
}
}
}

但是当我找到 NHibernate.Mapping.List<> 时,我不知道如何注入(inject)我的 UserType,例如 SoldProduct。

<list name="Addins" table="TicketLineAddin" fetch="join">
<key column="TicketLineId" ..../>
<index column="AddinIndex"/>
<composite-element class="Domain.Catalogue.SoldProduct, Domain">
<property name="ProductId" not-null="true"/>
<property name="ProductName" not-null="true" length="120"/>
<property name="Price" not-null="true" type="Decimal(12,3)"/>
<property name="VatId" column="VatId" not-null="true"/>
<property name="VatRate" column="VatRate" not-null="true" type="Decimal(12,3)"/>
<property name="PreparationType" not-null="true" type="Common.Ordering.PreparationType, Common"/>
<property name="PriceListId" not-null="true"/>
<property name="PrintMode" not-null="true"/>
</composite-element>
</list>

另一种方法是为 SQL Server 和 SQLite 应用程序使用不同的自定义 UserType 实现,并替换我的 .hbm 文件中的所有小数类型

<property name="Quantity" not-null="true" type="FixedPointUserType"/>

但是,是否有任何编程方法可以解决这个问题?

提前致谢

最佳答案

foreach (var mapping in config.CollectionMappings)
{
if (mapping.Element.Type.IsComponentType)
{
var subtypes = ((ComponentType)mapping.Element.Type).Subtypes;
for (int i =0; i < subtypes.Length; i++)
{
if (subtypes[i].GetType() == typeof(DecimalType))
{
subtypes[i] = new FixedPointDecimalUserType();
}
}
}
}

虽然无法测试

关于nhibernate - 是否有任何编程方法来注入(inject) nhibernate UserTypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915513/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com