So there can only ever be a single one-to-one relation between two entities? I don't understand.

Best Regards, David


On 1/17/2011 1:55 PM, Fabio Maulo wrote:
the matter is that you does not have a one-to-one relation.

On Thu, Jan 6, 2011 at 9:10 AM, David Schmitt <[email protected]
<mailto:[email protected]>> wrote:

    Hi everyone,

    I'm having troubles mapping two one-to-one relations and would like to
    check whether I'm doing the mapping wrong before filing a bug.

    My entities:
         public class Parent
         {
             public virtual int ID { get; set; }
             public virtual int ModuleId { get; set; }
             public virtual Child A { get; set; }
             public virtual Child B { get; set; }
         }

         public class Child
         {
             public virtual int ID { get; set; }
             public virtual Parent AParent { get; set; }
             public virtual Parent BParent { get; set; }
         }

    My tables:
         CREATE TABLE public.child
         (
           id serial NOT NULL,
           CONSTRAINT pk_child PRIMARY KEY (id)
         )

         CREATE TABLE public.parent
         (
           id serial NOT NULL,
           moduleid integer NOT NULL,
           a integer,
           b integer,
           CONSTRAINT pk_parent PRIMARY KEY (id),
           CONSTRAINT fk_a FOREIGN KEY (a)
               REFERENCES public.child (id),
           CONSTRAINT fk_b FOREIGN KEY (b)
               REFERENCES public.child (id)
         )

    My mapping, according to section 5.1.11. one-to-one, "unique foreign key
    associations":
    <class name="Parent">
    <id name="ID">
    <generator class="native"/>
    </id>
    <property name="ModuleId" />
    <many-to-one name="A"
                        class="Child" />
    <many-to-one name="B"
                        class="Child" />
    </class>

    <class name="Child">
    <id name="ID">
    <generator class="native"/>
    </id>

    <one-to-one name="AParent"
                       class="Parent"
                       constrained="false"
                       property-ref="A" />
    <one-to-one name="BParent"
                       class="Parent"
                       constrained="false"
                       property-ref="B" />
    </class>

    My query:
         List<Child> childs = session
             .Query<Child>()
             .Where(i => (i.AParent != null && i.AParent.ModuleId == 10)
                 || (i.BParent != null && i.BParent.ModuleId == 10))
             .ToList();

    That is, select all Childs whose parent has a ModuleId == 10 or no
    parent at all.

    The problem now is, that this is translated into wrong SQL:

         select child0_.ID as ID1_
         from Child child0_, Parent parent1_, Parent parent2_
         where
             child0_.ID=parent1_.A
             and child0_.ID=parent2_.B
             and (
                 (child0_.ID is not null) and parent1_.ModuleId=:p0
                 or (child0_.ID is not null) and parent2_.ModuleId=:p1);
         :p0 = 10 [Type: Int32 (0)], :p1 = 10 [Type: Int32 (0)]

    A similar query is created using this HQL:
         from Child c
         where c.AParent.ModuleId = 10 or c.BParent.ModuleId = 10

    Here's the query I'd expect:

         select child0_.ID as ID1_
         from Child child0_
             left join Parent parent1_ on (child0_.ID=parent1_.A)
             left join Parent parent2_ on (child0_.ID=parent2_.B)
         where
             (parent1_.A is not null) and parent1_.ModuleId=10
             or (parent2_.B is not null) and parent2_.ModuleId=10



    What have I done wrong? Or, is this an NHibernate bug?



    Best Regards, David

    --
    dasz.at <http://dasz.at> OG              Tel: +43 (0)664 2602670
    Web: http://dasz.at
    Klosterneuburg                                         UID: ATU64260999

           FB-Nr.: FN 309285 g          FB-Gericht: LG Korneuburg

    --
    You received this message because you are subscribed to the Google
    Groups "nhusers" group.
    To post to this group, send email to [email protected]
    <mailto:[email protected]>.
    To unsubscribe from this group, send email to
    [email protected]
    <mailto:nhusers%[email protected]>.
    For more options, visit this group at
    http://groups.google.com/group/nhusers?hl=en.




--
Fabio Maulo

--
You received this message because you are subscribed to the Google
Groups "nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.


--
dasz.at OG              Tel: +43 (0)664 2602670     Web: http://dasz.at
Klosterneuburg                                         UID: ATU64260999

       FB-Nr.: FN 309285 g          FB-Gericht: LG Korneuburg

--
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to