gpt4 book ai didi

c# - 如何映射到 NHibernate 中的 SortedList

转载 作者:行者123 更新时间:2023-11-30 22:17:43 24 4
gpt4 key购买 nike

我有一个 nHibernate 父子表关系。父类目前正在将 children 拉入一个列表,但我想根据表中的排序列将它们放入一个 SortedList 中。如何更改 NHibernate 映射文件以让系统​​知道我在哪个列上排序?

当前的 NHibernate 映射文件是:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Model.Configuration.Pages"
assembly="Model.Configuration">
<joined-subclass
table="PageConfigurations"
name="PageConfiguration"
extends="Model.Configuration.Configuration.TargetedConfiguration"
lazy="false">
<key column="TargetedConfigurationId" />

<property name="SchemaVersion" />

<property name="Template" type="System.String" length="50" />

<property name="PageKey" type="System.String" length="50" />

<property name="Percentage" />

<bag name="Controls" cascade="all-delete-orphan" lazy="false" >
<key column="PageConfigurationId" />
<one-to-many class="WidgetConfiguration"/>
</bag>

</joined-subclass>
</hibernate-mapping>

对于父表和:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Model.Configuration.Pages"
assembly="Model.Configuration">
<class name="WidgetConfiguration" lazy="false" table="PageConfiguration_Widgets" discriminator-value="Default">
<id name="Id" unsaved-value="0" type="int" >
<generator class="identity" />
</id>
<discriminator column="ConfigurationType" />

<property name="Slot" type="System.String" length="100" />
<property name="WidgetTypeName" type="System.String" length="100"/>
<property name="ViewName" type="System.String" length="50" />
<property name="SlotOrder" type="System.Int32" />
</class>
</hibernate-mapping>

对于子表。

我需要向父映射或子映射添加什么,让他们知道在将 WidgetConfiguration 提取到 SortedList 中时应将新的 SlotOrder 列用作关键字段。

编辑:数据被读入的类是:

public class PageConfiguration : TargetedConfiguration 
{

public PageConfiguration()
{
// replaced by SortedList
//Controls = new List<WidgetConfiguration>();
Controls = new SortedList<int, WidgetConfiguration>();
}

public string PageKey { get; set; }
public string Template { get; set; }
public int? Percentage { get; set; }
// replaced by SortedList
//public IList<WidgetConfiguration> Controls { get; set; }
public IDictionary<int, WidgetConfiguration> Controls { get; set; }
public int SchemaVersion { get; set; }
}

请注意 List<WidgetConfiguration>已更改为 SortedList<int, WidgetConfiguration> .当新项目添加到 SortedList 时,我如何告诉 NHibernate 使用的键值应该是 WidgetConfiguration.SlotOrder?

最佳答案

NHiberante 对您想要的东西有很好的支持。其实方法不止一种,有两种:

1) 与 <list> 的映射

使用支持<index>的列表映射柱子。这与 List<T> 中使用的 C# 中的内部 index 相同对象

小缺点是,您必须将该列从 0 开始...包括所有数字。与底层 C# 对象相同。但它有效

请在此处查看更多信息:http://ayende.com/blog/4043/nhibernate-mapping-list这里是索引集合:http://nhibernate.info/doc/nh/en/index.html#collections-ofvalues

2) 使用 order-by="column_name asc|desc" 扩展映射

这允许使用一些更用户友好的列(具有一些可编辑的值)用于在加载期间对列表进行排序

请在此处查看更多信息:6.2. Mapping a Collection

编辑:按照问题编辑

C# SortedList NHibernate 再次支持映射。请参阅 6.6. Sorted Collections 部分

映射应该是这样的

<map name="Controls" order-by="SlotOrder" lazy="true" cascade="all-delete-orphan">
<key column="PageConfigurationId" />
<index column="SlotOrder" type="System.Int32"/>
<one-to-many class="WidgetConfiguration"/>
</map>

SlotOrder现在由 Parent 管理。它扮演着控制键的角色SortedList .所以我们应该将其映射更改为只读(应该只存在一个编辑时间点)

<class name="WidgetConfiguration" ...>
...
<property name="SlotOrder" type="System.Int32" insert="false" update="false" />

有了这个映射,我们可以将新的item 添加到Controls 中收藏:

WidgetConfiguration config = ...;
PageConfiguration pageConfig = ...;

pageConfig.Controls[config.SlotOrder] = config;
session.Update(pageConfig);

所以,

  1. 我们已经映射了 SortedList(实际上是接口(interface) IDictionary<,>),
  2. SlotOrder用作键(由 NHibernate 插入、更新)
  3. 在 WidgetConfiguration 上可用(只读)

这应该可以回答有关排序和字典键的问题...如果我遗漏了什么请告诉我...

关于c# - 如何映射到 NHibernate 中的 SortedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618254/

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