Laden...

fluentNhibernate : ManyToMany klappt nicht ...

Erstellt von Ahrimaan vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.019 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 11 Jahren
fluentNhibernate : ManyToMany klappt nicht ...

verwendetes Datenbanksystem: <MySql>

Hallo zusammen,

ich habe ein zwei Mappings von 2 Klassen :

public RAETaskMapping()
        {
            Table("RAE_Task");
            Id(p => p.ID,"Task_ID");
            Map(p => p.Closed,"Closed");
            References(p => p.ClosedBy,"FK_Employeeid_ClosedBy").Not.LazyLoad();
            Map(p => p.ClosedDate);
            Map(p => p.CreateDate);
            Map(p => p.ExtendedInfo);
            References(p => p.CreatedFrom, "FK_Employeeid_CreatedFrom").Not.LazyLoad();
            References(p => p.Employee, "FK_Employeeid_Employee").Cascade.All().Not.LazyLoad();
            HasManyToMany(p => p.NextRevisor).Cascade.All().ChildKeyColumn("Employee_ID").ParentKeyColumn("Task_ID").Not.LazyLoad();
            Map(p => p.Name).Not.Nullable();
            Map(p => p.Comment);
        }
 public EmployeeMapping()
        {
            Table("Employee");
            Id(p => p.ID, "Employee_ID");
            Map(p => p.Forename);
            Map(p => p.Surname);
            Map(p => p.Username);
            Map(p => p.PersonalNummer);
            Map(p => p.PasswordHash);
            Map(p => p.PasswordSalt);
            References(p => p.Group,"FK_GroupId");
            HasMany(p => p.Tasks).KeyColumn("FK_Employeeid_Employee").Cascade.SaveUpdate().Not.LazyLoad();
            HasManyToMany(p => p.AssignedTo).ChildKeyColumn("Task_ID").ParentKeyColumn("Employee_ID").Not.LazyLoad();
            Map(p => p.Email);
        }

Und die beiden Klassen dazu :

    [Serializable]
    public class RAETask
    {
        public virtual int ID { get; set; }
        public virtual string Name { get; set; }
        public virtual bool Closed { get; set; }
        public virtual DateTime CreateDate { get; set; }
        public virtual Employee CreatedFrom { get; set; }
        public virtual DateTime? ClosedDate { get; set; }
        public virtual Employee ClosedBy { get; set; }
        public virtual Employee Employee { get; set; }
        public virtual IList<Employee> NextRevisor { get; set; }
        public virtual string ExtendedInfo { get; set; }
        public virtual string Comment { get; set; }

        public virtual bool Equals(object obj)
        {
            return Equals(this, (RAETask) obj);
        }
        protected virtual bool Equals(RAETask x ,RAETask y)
        {
            return x.ID == y.ID && y.Name == x.Name;
        }
    }
    [Serializable]
    public class Employee
    {
        public virtual int ID { get; set; }
        public virtual string Forename { get; set; }
        public virtual string Surname { get; set; }
        public virtual EmployeeGroup Group { get; set; }
        public virtual string Username { get; set; }
        public virtual string Email { get; set; }
        public virtual string PersonalNummer { get; set; }
        public virtual IList<RAETask> Tasks { get; set; }
        public virtual IList<RAETask> AssignedTo { get; set; } 
        public virtual string PasswordHash { get; set; }
        public virtual string PasswordSalt { get; set; }
    }

Im Speziellem gehts mir ind er Klasse RAETask um die Property NextRevisor.
Egal wie ich mich anstelle : In der ForeignKeyTabelle landet kein Datensatz. Beim Debuggen sind in der Collection Werte enthalten, sobald ich aber speichere kommt nix bei der Datenbank an.

Jmd ne Idee ?

R
18 Beiträge seit 2006
vor 11 Jahren

Bei bidirektionalem Many-To-Many Mapping braucht NHibernate, von beiden Seiten, den Namen der Indextabelle.

The Table call is currently only required if you're doing a bidirectional many-to-many, because Fluent NHibernate currently can't guess what the name should be; for all other associations it isn't required. https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started Chapter: Mappings

In deinem Fall in etwa so:


public RAETaskMapping()
         {
           ...
             HasManyToMany(p => p.NextRevisor).Cascade.All().ChildKeyColumn("Employee_ID").ParentKeyColumn("Task_ID").Table("RAETaskEmployee").Not.LazyLoad();
           ...
         }


public EmployeeMapping()
         {
             ...
             HasManyToMany(p => p.AssignedTo).ChildKeyColumn("Task_ID").ParentKeyColumn("Employee_ID").Table("RAETaskEmployee").Not.LazyLoad();
             ...
         }