23 Stimmen

fließend nhibernate HasOne WithForeignKey funktioniert nicht

Wenn ich eine Aufgabenklasse lade, ist die Dokumenteigenschaft immer null, obwohl Daten in der Datenbank vorhanden sind.

Aufgabenklasse:

public class Task
{
    public virtual Document Document { get; set; }

Überschreibung der Aufgabenabbildung für AutoPersistenceModel:

public void Override(AutoMap<Task> mapping)
{
    mapping.HasOne(x => x.Document)
        .WithForeignKey("Task_Id");

Wie Sie Form sehen können, was NHProf sagt, wird ausgeführt, die Join-Bedingung ist falsch, die WithForeignKey doesnt scheinen Wirkung zu nehmen. In der Tat kann ich jede Zeichenfolge in den obigen Code schreiben und es macht keinen Unterschied.

FROM   [Task] this_
    left outer join [Document] document2_
    on this_.Id = document2_.Id

So sollte es sein:

FROM   [Task] this_
    left outer join [Document] document2_
    on this_.Id = document2_.Task_Id

Wenn ich die Daten in der Datenbank hacke, so dass die IDs übereinstimmen, werden die Daten geladen, aber offensichtlich ist dies nicht korrekt - aber zumindest beweist es, dass es Daten lädt.

Bearbeiten: Stöbern in der fluent nhib Quelle zu finden, die XML produziert diese:

<one-to-one foreign-key="Task_Id" cascade="all" name="Document" class="MyProject.Document, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 

Bearbeiten: Hier ist das Schema:

CREATE TABLE [dbo].[Document](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Task_Id] [int] NOT NULL,

CREATE TABLE [dbo].[Task](
[Id] [int] IDENTITY(1,1) NOT NULL,

Hat jemand eine Idee?

Danke

Andrew

0voto

Sean Punkte 223

Ich habe mit dem gleichen Has One-Problem gekämpft und schließlich herausgefunden, dass dies funktioniert:

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.Id);
        HasOne(s => s.Child).Cascade.All();
    }
}

 public class ChildMap : ClassMap<Model.Child>
{
    public ChildMap()
    {
        Id(x => x.Id);
        HasOne(s => s.Parent).Constrained().ForeignKey();           
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X