1

Ich bin ziemlich neu in NHibernate und .NET Framework.Erstellen mehrerer bidirektionaler Eins-zu-viele-Verknüpfungen mit Fluent NHibernate automapping

Ich möchte meine Projektklasse zuordnen, die One-to-many-Beziehungen Subproject und ProjectTask-Klassen hat.

public class Project : ProjectItem 
{ 
    public virtual IList<Subproject> Subprojects { get; set; } 

    public virtual IList<ProjectTask> Tasks { get; set; } 

    [NotNull] 
    public virtual ProjectStatus Status { get; set; } 

    public Project() 
    { 
     Subprojects = new List<Subproject>(); 
     Tasks = new List<ProjectTask>(); 
     Status = new ProjectStatus(); 
    } 

    public virtual void AddSubProject(Subproject subproject) 
    { 
     subproject.Project = this; 
     Subprojects.Add(subproject); 
    } 

    public virtual void RemoveSubProject(Subproject subproject) 
    { 
     Subprojects.Remove(subproject); 
    } 

    public virtual void AddTask(ProjectTask task) 
    { 
     task.Project = this; 
     Tasks.Add(task); 
    } 

    public virtual void RemoveTask(ProjectTask task) 
    { 
     Tasks.Remove(task); 
    } 
} 

public class ProjectTask : ProjectItemTask 
{ 
    [NotNull] 
    public virtual Project Project { get; set; } 
} 

public class Subproject : ProjectItem 
{ 
    [NotNull] 
    public virtual Project Project { get; set; } 
} 

Meine Entitäten erben die ID-Eigenschaft von einer abstrakten Basisklasse.

Ich benutze meine Automapping-Zuordnungen zu über neu zu definieren:

public class ProjectMappingOverride : IAutoMappingOverride<Project> 
{ 
    public void Override(AutoMapping<Project> mapping) 
    { 
     mapping.HasMany<Subproject>(x => x.Subprojects) 
      .Cascade.All() 
      .Inverse() 
      .Not.LazyLoad() 
      .AsBag(); 

     mapping.HasMany<ProjectTask>(x => x.Tasks) 
      .Cascade.All() 
      .Inverse() 
      .Not.LazyLoad() 
      .AsBag(); 

     mapping.HasOne<ProjectStatus>(x => x.Status) 
      .Cascade.All() 
      .Not.LazyLoad(); 
    } 
} 

public class SubprojectMappingOverride : IAutoMappingOverride<Subproject> 
{ 
    public void Override(AutoMapping<Subproject> mapping) 
    { 
     mapping.References<Project>(x => x.Project) 
      .ForeignKey("ProjectId"); 
    } 
} 

public class ProjectTaskMappingOverride : IAutoMappingOverride<ProjectTask> 
{ 
    public void Override(AutoMapping<ProjectTask> mapping) 
    { 
     mapping.References<Project>(x => x.Project) 
      .ForeignKey("ProjectId"); 
    } 
} 

Als ich den Verein Karte mit dem Teilprojekt Klasse allem nur funktionieren gut und alle Instanzen von Teilprojekt Klasse in Project.Subprojects wird zur Datenbank gespeichert werden korrekt. Wenn ich die zweite Überschreibung für ProjectTask-Klasse verwende, erhalte ich die folgende Ausnahme:

---> NHibernate.HibernateException: Es gibt bereits ein Objekt mit dem Namen "ProjectId" in der Datenbank. Constraint konnte nicht erstellt werden. Siehe vorherige Fehler.

---> System.Data.SqlClient.SqlException: Es gibt bereits ein Objekt mit dem Namen 'ProjectId' in der Datenbank.

Weiß jemand, warum das passiert?

Antwort

3

Sie sollten Ihre Projektreferenzen mit einem Column und kein ForeignKey

mapping.References<Project>(x => x.Project) 
      .Column("ProjectId"); 
+0

Ja, das hat mir sehr geholfen Karte! Danke vielmals! – dasnervtdoch

Verwandte Themen