Laden...

Fluent NHibernate Many-to-Many Mapping Problem

Erstellt von Wax vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.306 Views
Wax Themenstarter:in
731 Beiträge seit 2006
vor 12 Jahren
Fluent NHibernate Many-to-Many Mapping Problem

verwendetes Datenbanksystem: <SQLServer 2008>

Hallo,

im Anhang findet ihr ein Diagramm von meinem verwendeten Datenbankmodell.

Dazu habe ich folgende Mapping-Klassen erstellt:


 class EmployeeMap : ClassMap<Employee>
    {        
        public EmployeeMap()
        {
            Table("dbo.Employees");
            Id(x => x.Id).Column("Id").GeneratedBy.Increment();
            Map(x => x.FirstName).Column("FirstName").Not.Nullable();
            Map(x => x.LastName).Column("LastName").Not.Nullable();
            References(x => x.Store).Column("StoreIdFk");
        }
    }

 class ProductMap : ClassMap<Product>
    {
        public ProductMap()
        {
            Table("dbo.Products");
            Id(x => x.Id).Column("Id").GeneratedBy.Increment();
            Map(x => x.Name).Column("Name").Not.Nullable();
            Map(x => x.Price).Column("Price").Not.Nullable();
            HasManyToMany<Store>(x => x.StoresStockedIn)
                .Table("dbo.StoreProductRel")
                .ParentKeyColumn("Id")
                .ChildKeyColumn("ProductIdFk")
                .Cascade.All().Inverse();
        }
    }

  class StoreMap : ClassMap<Store>
    {
        public StoreMap()
        {
            Table("dbo.Stores");
            Id(x => x.Id).Column("Id").GeneratedBy.Increment();
            Map(x => x.Name).Not.Nullable();
            HasMany(x => x.Staff).KeyColumn("StoreIdFk").Inverse().Cascade.All();
            HasManyToMany(x => x.Products)
                .Table("dbo.StoreProductRel")
                .ParentKeyColumn("Id")
                .ChildKeyColumn("StoreIdFk").Cascade.All();
        }
    }

Ich erzeuge im Testprogramm nun ein paar Objekte mit allen Beziehungen usw.
Dann rufe ich auf meinem Session-Objekt session.SaveOrUpdate(obj1) auf.
Beim Aufruf von Commit an meinem Transaktionsobjekt, wird mir allerdings folgende Exception um die Ohren gehauen:

Fehlermeldung:
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.
Invalid column name 'Id'.

Die einzelnen Entitäten werden korrekt gespeichert, nur in der m:n Tabelle "StoreProductRel" steht nichts drin und die Fehlermeldung ist auch nicht so berauschend 😃

Weiß vielleicht jemand was ich da falsch mache?

MfG
wax

109 Beiträge seit 2011
vor 12 Jahren

Hallo,

ich bin auch ich zielmlicher Neuling mit NHibernate, also kann leider nur vermuten:

So wie es aussieht hast du eine Kreisbeziehung zwischen Store und Product... warum eigentlich? Hört sich für mich redundant an. Mach doch lieber eine Liste mit Stores, welche eine Liste mit Products haben und mehr nicht. Das wäre für mich dann auch eine n:m-Beziehung (ein Store hat mehrere Products und ein Product kann in mehreren Stores sein). Wenn du die Liste von Stores für ein Product benötigst, kannst du das über Datenbankabfragen ebenso auflösen (QueryOver, Sql, LinqToSql,...). Nur so ein Vorschlag... 😉

Ansonsten probiere mal aus dem ManyToMany-Mapping der Objekte ein HasMany zu machen. Hört sich in deinem Fall irgendwie richtiger an.

Gibt es einen Grund das du die Tabellen-und Spaltennamen jedesmal explizit mit angibst?

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

Wax Themenstarter:in
731 Beiträge seit 2006
vor 12 Jahren

Hallo,

ich habe die Beziehung aus beiden Richtungen beschrieben, da es in dem "Getting started..." Tutorial von Fluent NHibernate so gemacht wurde. Da dachte ich mir das sie wissen was sie tun. 😃

Wegen den Tabellen und Spaltennamen: Ja die könnte ich mit Sicherheit weglassen!

MfG
wax

Wax Themenstarter:in
731 Beiträge seit 2006
vor 12 Jahren

Ich habs ans Laufen gebracht. Allerdings musste ich nachgeben und ein paar Spalten der Datenbank umbenennen. Anstatt "StoreIdFk" z.B. "Store_id". Halt so wie es (Fluent) NHibernate erwartet. Find ich eigentlich komisch, da ich doch einen Namen für die Spalten angeben kann, die von den erwarteten Konventionen abweichen. 🤔

MfG
wax