繁体   English   中英

Nhibernate一对一关系返回始终为null

[英]Nhibernate one-to-one relation return always null

我有两张桌子

第一个包含Widget属性:

的SQL

CREATE TABLE [dbo].[WidgetProperty](
    [WidgetPropertyID] [int] IDENTITY(1,1) NOT NULL,
    [WidgetID] [int] NOT NULL,
    [PropertyID] [int] NOT NULL,
    [PropertyIndex] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
    [WidgetPropertyID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[WidgetProperty] ADD  DEFAULT ((1)) FOR [PropertyIndex]

HBM

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Nt.Engine.domain.WidgetProperty,Nt.Engine" table="WidgetProperty" lazy="true">
    <id name="WidgetPropertyID" column="WidgetPropertyID">
      <generator class="native" />
    </id>
    <property name="WidgetID" column="WidgetID" type="Int32" not-null="true" />
    <property name="PropertyID" column="PropertyID" type="Int32" not-null="true" />
    <property name="PropertyIndex" column="PropertyIndex" type="Int32" not-null="true" />
    <one-to-one name="PropertyDetail" cascade="all" foreign-key="none" class="Nt.Engine.domain.PropertyDetail,Nt.Engine"  />  
  </class>
</hibernate-mapping>

模型

public class WidgetProperty
{
    public virtual Int32 WidgetPropertyID { get; set; }
    public virtual Int32 WidgetID { get; set; }
    public virtual Int32 PropertyID { get; set; }
    public virtual Int32 PropertyIndex { get; set; }
    public virtual PropertyDetail PropertyDetail { get; set; }
}

第二个包含每个属性的数据/详细信息:

的SQL

CREATE TABLE [dbo].[PropertyDetail](
    [PropertyID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [Length] [nvarchar](50) NOT NULL,
    [Type] [smallint] NOT NULL,
    [DefaultHtml] [nvarchar](600) NULL,
 CONSTRAINT [PK_PropertyDetail] PRIMARY KEY CLUSTERED 
(
    [PropertyID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[PropertyDetail] ADD  CONSTRAINT [DF__tblProper__Prope__276EDEB3]  DEFAULT ((1)) FOR [Type]

HBM

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Nt.Engine.domain.PropertyDetail,Nt.Engine" table="PropertyDetail" lazy="true">
    <id name="PropertyID" column="PropertyID">
      <generator class="native" />
    </id>
    <property name="Name" column="Name" type="string" length="50" not-null="true" />
    <property name="Length" column="Length" type="string" length="50" not-null="true" />
    <property name="Type" column="Type" type="byte" not-null="true" />
    <property name="DefaultHtml" column="DefaultHtml" type="string" length="600" not-null="false" />
  </class>
</hibernate-mapping>

模型

public class PropertyDetail
{
    public virtual Int32 PropertyID { get; set; }
    public virtual String Name { get; set; }
    public virtual String Length { get; set; }        
    public virtual byte Type { get; set; }
    public virtual String DefaultHtml { get; set; }
}

基本上在第一个表,我已经为每个几排WidgetIDPropertyIDPropertyDetail表中的一个对一个,所以每个WidgetProperty.PropertyID在短短一行PropertyDetail表。 在管理器中,如果我通过widgetID (例如4)调用对象,则WidgetProperty.PropertyDetail始终为null。 有什么提示吗?

一对一引用用于连接共享相同PK的记录,或者辅助表具有引用父行的FK的记录。 (使用property-ref选项)在您的情况下,您希望父表上的列指向子行。 这被配置为多对一关系。

<many-to-one name="PropertyDetail" cascade="all" column="PropertyId" class="Nt.Engine.domain.PropertyDetail,Nt.Engine"  /> 

如果要一对一,则需要用WidgetPropertyId替换PropertyDetail表上的PropertyId。 本质上,如果PropertyId值等于WidgetPropertyId,则实际上您将返回当前代码,这肯定不是您期望的。 即,如果您有一个WidgetProperty / w ID 1234和PropertyId为5, 如果有一个ID为1234的PropertyDetail,它将与Widget 1234关联,因为一对一的性质寻找匹配的PK。

编辑:上面做了一个更正。 如果您想要一对一,可以反转FK关联,在这种情况下,将WidgetPropertyId添加到PropertyDetail并从WidgetProperty中删除PropertyId。 从那里可以通过删除外键并将其替换为property-ref来设置从Widget到PropertyDetail的一对一关系,以告诉NH通过FK列而不是PK链接PropertyDetail:

<one-to-one name="PropertyDetail" cascade="all" property-ref="WidgetPropertyId" class="Nt.Engine.domain.PropertyDetail,Nt.Engine"  />  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM