相关疑难解决方法(0)

NHibernate映射 - 一对一(或一对零)

NHibernatians!

我有一张桌子[dbo].[Wibble]和另一张桌子[dbo].[WibbleExtended].

[Wibble]是主表,[WibbleExtended]是一个可选表,其中存储了一些其他字段.[WibbleExtended]表中的条目远少于主[Wibble]表.我认为这是在当天完成的,以解决一些空间问题(Wibble有很多行,而WibbleExtened有很多列).

每个表的ID都是相同的,来自外部源.

[dbo].[Wibble].[WibbleId]
Run Code Online (Sandbox Code Playgroud)

[dbo].[WibbleExtended].[WibbleId]
Run Code Online (Sandbox Code Playgroud)

是相同的,这两个表是如何相关的.

注意我无法更改架构.我对这个我几乎无法控制的遗留系统非常感兴趣.

在它周围搜索似乎一对一的映射是有问题的,并且流行的智慧是使用两个多对一映射.

我的映射目前是:

<class name="Wibble" table="Wibble" >
   <id name="Id" column="WibbleId" type="Int32">
      <generator class="assigned"/>
   </id>

   <many-to-one name="WibbleExtended" class="WibbleExtended" column="WibbleId" not-null="false" cascade="all"/>
</class>
Run Code Online (Sandbox Code Playgroud)

<class name="WibbleExtended" table="WibbleExtended" >
   <id name="Id" column="WibbleId" type="Int32">
        <generator class="assigned" />
   </id>

   <many-to-one name="Wibble" class="Wibble" column="WibbleId" not-null="true" />     
 </class>
Run Code Online (Sandbox Code Playgroud)

这个问题是我遇到了诸如此类的错误

System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.
Run Code Online (Sandbox Code Playgroud)

我环顾四周,看起来确实是正确的策略,它只是落在了最后的障碍.

问题是id生成器吗?映射的其他方面?

正确答案的免费碎肉馅饼.

编辑:好的 - 这就是我通过@James Gregory解决这个问题的方法.

  1. 将单元测试从WibbleExtended测试移至Wibble测试类并进行必要的修改.

  2. 在Wibble.hbm.xml中添加了以下内容

    <join table="WibbleExtended" optional="true">
         <key column="WibbleId"/>
         <property name="Blah1" column="Blah1" type="String" length="2000" not-null="false" …
    Run Code Online (Sandbox Code Playgroud)

c# nhibernate nhibernate-mapping

7
推荐指数
2
解决办法
1万
查看次数

按代码映射零或一关系

我有以下数据库结构,我无法更改

CREATE TABLE Users (
    ID INT NOT NULL IDENTITY(1,1),
    PRIMARY KEY(ID)
)

CREATE TABLE UserAvatars (
    UserID INT NOT NULL,
    Width INT NOT NULL,
    Height INT NOT NULL,

    PRIMARY KEY(UserID),
    FOREIGN KEY(UserID) REFERENCES Users(ID),
)
Run Code Online (Sandbox Code Playgroud)

基本上,用户可以拥有零个或一个头像(我删除了列以简化示例)。

class User
{
    public int ID { get; protected set; }

    public UserAvatar Avatar { get; set; }
}

class UserAvatar
{
    public User User { get; set; }
    public int Width { get; set; }
    public int Height …
Run Code Online (Sandbox Code Playgroud)

.net c# nhibernate nhibernate-mapping fluent-nhibernate

5
推荐指数
1
解决办法
999
查看次数