gpt4 book ai didi

NHibernate navigators 映射到组合键问题的一部分——遗留数据库的使用

转载 作者:行者123 更新时间:2023-12-04 15:48:51 24 4
gpt4 key购买 nike

我们有一个无法更改的旧数据库。而且我们正试图转移到 NHibernate 而不是旧的 DataAccess 层,这是一个垃圾并且太慢了。

它有这样的表:

GPI 表有 (PU_ID, PAR_ID, Data, Data2) 列
BLOCK 表有 (GA_ID, Data, PAR_ID) 列
COMPANY 表有 (PU_ID, Data) 列

我为上面的表格创建了这些映射:

GPI

<class name="GroupPartnerInterest" table="[GPI]">
<composite-id >
<key-property name="GroupId" column="PAR_ID" />
<key-property name="CompanyId" column="PU_ID" />
</composite-id>
<property name="data" column="Data"/>
<property name="data2" column="Data2"/>
<many-to-one name="Company" fetch="select" cascade="none">
<column name="PU_ID"/>
</many-to-one>
<set name="Blocks" cascade="none" inverse="true" fetch="select">
<key property-ref="GroupId">
<column name="PAR_ID"/>
</key>
<one-to-many class="Block"/>
</set>
</class>

堵塞
<class name="Block" table="[BLOCK]" >
<id name="BlockId" column="GA_ID" >
<generator class="assigned"/>
</id>
<property name="data" column="Data"/>
<property name="GroupId" column="PAR_ID"/>
<set name="GroupPartnerInterests" cascade="all-delete-orphan" fetch="select">
<key property-ref="GroupId">
<column name="PAR_ID"/>
</key>
<one-to-many class="GroupPartnerInterest"/>
</set>
</class>

公司
<class name="Company" table="[COMPANY]">
<id name="CompanyId" column="PU_ID">
<generator class="assigned"/>
</id>
<property name="data" column="Data"/>
<set name="GroupPartnerInterests" cascade="none" inverse="true" fetch="select">
<key>
<column name="PU_ID"/>
</key>
<one-to-many class="GroupPartnerInterest"/>
</set>
</class>

这些类(class)非常简单明了。所有实现 Equals 和 GetHashCode 方法。

以下是可用的导航器列表:
  • GroupPartnerInterest.Company - 效果很好
  • Company.GroupPartnerInterests - 效果很好
  • GroupPartnerInterest.Company - 效果很好

  • 这两个失败了:
  • Block.GroupPartnerInterests:

  • 我有一个单元测试:
    [TestMethod]
    public void TestGroupPartnerInterests()
    {
    using ( ISession session = SessionFactory.OpenSession() )
    {
    IList<Block> blocks = session.CreateCriteria( typeof( Block ) )
    .SetMaxResults( 5 ).List<Block>();

    foreach ( var block in blocks )
    {
    TestContext.WriteLine( "Block #{0}", block.BlockId );

    if ( block.GroupPartnerInterests != null )
    {
    foreach ( GroupPartnerInterest gpi in block.GroupPartnerInterests )
    {
    TestContext.WriteLine( "Company '{0}':", gpi.Company.CompanyId );
    }
    }
    }
    }
    }

    如果我在 GPI 映射测试中注释掉块导航映射工作并输出一些数据:

    Block #1
    Company 'LALA':
    Company 'LALA SA':
    Block #2
    Company 'BG PO':
    Company 'LIMPOPO':
    Block #3
    Company 'HAHA':
    Company 'Other partner(s)':
    Block #4



    但测试失败并出现以下错误:

    NHibernate.LazyInitializationException: Initializing[Model.EntityClasses.Block#999]-failed to lazily initialize a collection of role: Model.EntityClasses.Block.GroupPartnerInterests, no session or session was closed.



    '999' 是现有的 PAR_ID - 数据是一致的:有两个具有这个 PAR_ID 的块和 GPI 中的一些记录。

    为什么它会在某个时候关闭 session ?
  • GroupPartnerInterest.Blocks:

  • 单元测试与我上面提到的几乎相同,只是使用了不同的属性。
    错误如下:

    NHibernate.MappingException: NHibernate.MappingException: property not found: GroupId on entity Model.EntityClasses.GroupPartnerInterest.



    如果我从 GPI 映射中的 Blocks 导航器的元素中删除“property-ref=GroupId”,我将得到以下异常:

    NHibernate.FKUnmatchingColumnsException: NHibernate.FKUnmatchingColumnsException: Foreign key (FKA3966498349694F:[BLOCK] [PAR_ID])) must have same number of columns as the referenced primary key ([GPI] [PAR_ID, PU_ID]).



    有什么方法可以将 Blocks 映射到 GPI 以便 GroupPartnerInterest.Blocks 导航器可以工作吗?

    谢谢,
    亚历克斯

    最佳答案

    问题如下:

  • 如果您有一个具有复合 Material 的实体
    id,所有对它的引用都必须
    维护复合ID,所以有
    必须是两个外键。
  • GroupPartnerInterest 中的块是一个集合,所以外键在 Blocks ,指向 GroupPartnerInterest .它将需要两个外键,而这些外键不可用。
  • property-ref是用其他一些属性替换主键。因此,它是关系一侧的表的属性,即 GroupPartnerInterest ,但没有 GroupId .
  • 您可能可以使用 property-refGroupPartnerInterest.Blocks (因为缺少两个外键,使 Block.PAR_ID 指向 GPI.PAR_ID ),但我会三思而后行。

  • 我不能在这里给你一个可行的解决方案。我不使用复合键,这更复杂。但还有一些想法:
  • 我会尽量避免使用复合键。如果不可能,请编写一个表示组合键的类。这使它更容易处理。
  • 我会尽量避免不基于主键的关系。可能有理由不这样做,NH支持他们,我只是认为他们造成了麻烦。


  • 为什么 session 关闭?我不知道,我会看一下堆栈跟踪。它真的是从 using 块中抛出的异常吗?或者它是从 TestCleanup 抛出的方法?

    关于NHibernate navigators 映射到组合键问题的一部分——遗留数据库的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3537021/

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