gpt4 book ai didi

c# - 在运行时扩展/修改 NHibernate 类

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

很抱歉,如果已经有一个正确的答案,但我还没有找到。我正在使用 NH3,我有一个用例,我想将一个 Set 添加到类实现特定接口(interface)的任何实体上。我有一个配置构建器类,因此我可以在创建 session 工厂之前进行这些更改。

给出这个简化的例子:

public class Person : IHasExtraItems
{
public Person()
{
this.ExtraItems = new HashSet<ExtraItem>();
}
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual DateTime Birthdate { get; set; }
public virtual ICollection<ExtraItem> ExtraItems { get; protected set; }
}

public class ExtraItem
{
public virtual Guid Id { get; set; }
}

这个示例映射:

  <class name="Person">
<id name="Id">
<generator class="guid"/>
</id>
<property name="Name"/>
<property name="Birthdate"/>
<set name="Extra" table="PersonExtraItems" cascade="all">
<key column="PersonId"/>
<many-to-many column="ExtraItemId" class="ExtraItem" unique="true" />
</set>
</class>

由于我希望能够透明地将此功能应用于许多类——仅通过实现接口(interface)——我不想将“ExtraItem”放入映射中。相反,我想在运行时添加它。因此,如果我从 xml 映射中删除该属性,我该如何在运行时添加它?

下面的内容准确描述了我要尝试进行的更改类型: http://ayende.com/Blog/archive/2008/05/01/Dynamic-Mapping-with-NHibernate.aspx

但它不能映射多对多集合,而且我虚弱的大脑无法破译 nhibernate 用来创建效果的内存中映射表示。这是我最接近的,基于尝试让调试器中可见的属性匹配

foreach (var cls in cfg.ClassMappings)
{
if (typeof(IHasExtraItems).IsAssignableFrom(cls.MappedClass))
{
NHibernate.Mapping.Property property = new NHibernate.Mapping.Property();
NHibernate.Mapping.Set value = new NHibernate.Mapping.Set(cls);
value.Role = cls.EntityName + ".ExtraItems";
value.IsGeneric = true;
var table = new Table();
table.Name = cls.MappedClass.Name + "ExtraItems";
value.CollectionTable = table;
value.GenericArguments = new Type[] { typeof(ExtraItem) };
value.IsOptimisticLocked = true;
value.IsLazy = true;
mappings.AddCollection(value);
property.Value = value;

property.Name = "ExtraItems";
property.PersistentClass = cls;
property.Cascade = "all";
cls.AddProperty(property);
}
}

在测试中,这会产生运行时错误,因为键为空,但是 XML 映射版本有效,并且在我进行更改时看起来或多或少相同。

奖励积分:我特别想要多对多,因为我想要一个连接表。这让我可以将实体映射到具有真正外键的扩展数据以提高性能。 ExtraItems 实际上应该是一个值类型而不是一个真正的实体,但我不知道如何映射它,即使是在 XML 中也是如此。

奖励积分,第 2 部分:我可以用 confORM 来做这个吗?我不想将所有现有映射切换到 confORM,而且我找不到将 confORM 与传统 XML 映射混合的示例,更不用说修改现有映射了。 Fluent 是另一种选择,但我使用的是 NH3,我认为 Fluent 还不支持它。

提前致谢!

编辑 我很确定我的问题是我没有定义集合的元素。但是,我无法辨别如何正确定义集合的元素。

最佳答案

有适用于 NH3 的 fluent 构建,因此您可以使用它(我使用),如果您使用的是 fluent,则可以很容易地通过约定来实现。您在奖励积分部分提到了这一点,所以也许您应该再看一看?

关于c# - 在运行时扩展/修改 NHibernate 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894993/

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