gpt4 book ai didi

c# - 如何在 NHibernate ByCode 中分别映射相同类型的两个组件属性?

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:59 25 4
gpt4 key购买 nike

我需要在多个类中重用一个组件类型,但该组件类型的映射将根据它所在的根类而有所不同。我们正在使用 ByCode 映射 API 来实现这一点。

看起来应该很简单:只需为每个类显式映射不同的组件即可。

但是下面的测试在NHibernate 4.0.4.4000下失败了:

[TestFixture]
public class DuplicateComponentMappingTests
{
[Test]
public void TopLevelComponentsAreSpecialisedForRootEntity()
{
var cfg = ConfigureWithMappings(m => {
m.Class<RootA>(r => {
r.Id(x => x.Id);
r.Component(x => x.Component, c => {
c.Property(x => x.PropertyA);
});
});
m.Class<RootB>(r => {
r.Id(x => x.Id);
r.Component(x => x.Component, c => {
c.Property(x => x.PropertyB);
});
});
});
using (var sessionFactory = cfg.BuildSessionFactory())
{
using (var session = sessionFactory.OpenSession())
{
session.CreateSQLQuery("create table RootA ( Id int, PropertyA int )").ExecuteUpdate();
session.CreateSQLQuery("create table RootB ( Id int, PropertyB int )").ExecuteUpdate();
}

using (var session = sessionFactory.OpenSession())
{
session.Save(new RootA { Component = new Component { PropertyA = 1 } }); // Fails because there's no PropertyB column, even though we didn't map it for RootA.
session.Flush();
}
}
}

private Configuration ConfigureWithMappings(Action<ModelMapper> map)
{
...
}
}

class RootA
{
public virtual int Id { get; set; }
public virtual Component Component { get; set; }
}
class RootB
{
public virtual int Id { get; set; }
public virtual Component Component { get; set; }
}
class Component
{
public virtual int PropertyA { get; set; }
public virtual int PropertyB { get; set; }
}

更糟糕的是,我们实际的组件类包含组件本身,大约有 4 层深,它们还需要根据根实体改变它们的映射。

我尝试过的事情:

  • 为每个实体的组件属性使用不同的名称。没有运气;看起来映射是根据组件的类型共享的。
  • 为每个根实体使用单独的模型映射器。不是一个选项,因为在每种情况下,组件的映射可能取决于另一个类映射,如果我将该类添加到两个 ModelMappers,我会得到“重复”错误。

最佳答案

从 3.2/3.3 开始追踪这对已知错误:

所以现在的解决方案似乎是“那时候不要那样做”。我会在完全理解问题后尝试提交修复。

关于c# - 如何在 NHibernate ByCode 中分别映射相同类型的两个组件属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747465/

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