Frage

Wenn ich meinen viele, viele Klassen testen ein Fehler auftritt:

  

System.ApplicationException: Tatsächliche   Zahl ist gleich nicht Zahl erwartet.

Instanzen:

    public interface IEntity
    {
        int Id { get; set; }
    }

    public abstract class Entity : IEntity
    {
        public virtual int Id { get; set; }

        public virtual bool IsPersistent
        {
            get { return isPersistentObject(); }
        }

        public override bool Equals(object obj)
        {
            if (isPersistentObject())
            {
                var persistentObject = obj as Entity;
                return (persistentObject != null) && (Id == persistentObject.Id);
            }

            return base.Equals(obj);
        }

        public override int GetHashCode()
        {
            return isPersistentObject() ? Id.GetHashCode() : base.GetHashCode();
        }

        private bool isPersistentObject()
        {
            return (Id != 0);
        }
    }

    public class Team : Entity
    {
        public virtual string Name { get; set; }
        public virtual ISet<Employee> Employees { get; set; }

        public Team()
        {
            Employees = new HashedSet<Employee>();
        }
    }

    public class Employee : Entity
    {
        public virtual string LastName { get; set; }
        public virtual string FirstName { get; set; }
        public virtual ISet<Team> Teams { get; set; }
        public virtual string EMail { get; set; }

        public Employee()
        {
            Teams = new HashedSet<Team>();
        }
    }

Mappings:

public class TeamMap : ClassMap<Team>
{
    public TeamMap()
    {
        // identity mapping
        Id(p => p.Id).Column("TeamID");

        // column mapping
        Map(p => p.Name);

        // relationship mapping
        HasManyToMany(m => m.Employees)
            .Table("EmployeeTeam")
            .LazyLoad()
            .Cascade.SaveUpdate()
            .AsSet()
            .ParentKeyColumn("TeamID")
            .ChildKeyColumn("EmployeeID");
    }
}

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        // identifier mapping
        Id(p => p.Id).Column("EmployeeID");

        // column mapping
        Map(p => p.EMail);
        Map(p => p.LastName);
        Map(p => p.FirstName);

        // relationship mapping
        HasManyToMany(m => m.Teams).Table("EmployeeTeam")
            .Inverse()
            .Cascade.SaveUpdate()
            .AsSet()
            .LazyLoad()
            .ParentKeyColumn("EmployeeID")
            .ChildKeyColumn("TeamID");
    }
}

Test:

[TestMethod]
public  void  CanCorrectlyMapEmployee()
{
    var team = new List<Team> {new Team() {Name = "Team1"}};

    new PersistenceSpecification<Employee>(_session)
        .CheckProperty(p => p.EMail, "Mail")
        .CheckProperty(p => p.FirstName, "Firstname")
        .CheckProperty(p => p.Id, 1)
        .CheckProperty(p => p.LastName, "Lastname")
        .CheckList(p => p.Teams,team )
        .VerifyTheMappings();
}

Ob ich einen Mitarbeiter hinzufügen oder ein Team-meine EmployeeTeam Tabelle immer leer ist.

habe ich es gegen SQLLite mit FNH getestet und manuell gegen SQL Server 2008.

Hat jemand von euch eine Idee, dieses Problem beheben?

edit:

Ich war erstaunt zu erfahren, dass, wenn ich einen Mitarbeiter erstellen und 2 Teams an den Mitarbeiter hinzufügen und laden Sie die erstellte Mitarbeiter er hat zwei Teams. So funktioniert es gut. Aber wenn ich in meiner relationsip Tabelle EmployeeTeam sehen dann ist alles leer. Kann jemand mir erklären, warum?

Und Weiß jemand, wie ich Fluent NHibernate verwenden kann meine viele zu viele Beziehung zu testen?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Mitarbeiter Karte hat inverses Attribut. Wie Sie wahrscheinlich wissen, bedeutet dies, dass, wenn Sie speichern Mitarbeiter, Beziehungstabelle (EmployeeTeam) werden nicht aktualisiert. Zum Hinzufügen / Entfernen von Informationen neue Beziehung, die Sie Mitarbeiter für das Team und speichert Team hinzuzufügen haben.

Also, in Ihrem Fall - nicht testen viele zu viele auf der Seite der Mitarbeiter, Test es auf der Seite des Teams. (Wenn Sie wie NHibernate würde Datensätze hinzufügen, wenn Sie das Team Mitarbeiter hinzufügen, werden Sie umkehren müssen „Inverse“ Attribute - geben Sie es an Team, nicht Mitarbeiter, aber dann - gleiche Geschichte mit dem Team juristische Person).

Warum können Sie Mitarbeiter mit Teams laden? Wegen des sitzungs-Level-Cache. Sie haben wahrscheinlich gespeichert und geladen Mitarbeiter in der gleichen ISession - dies bedeutet, dass NHibernate Sie genau Bezug auf das gleiche Objekt zurück, ohne es aus dem db Laden. Versuchen Sie Speichern & Laden in zwei verschiedenen Sitzungen und Sie werden kein Team in Employee.Teams Satz zur Verfügung.

Side Hinweis: Es ist eine gute Praxis betrachtet Methoden zu schaffen, die Konsistenz zwischen many-to-many-Beziehungen erzwingen wird, das ist - wenn Sie Team Mitarbeiter hinzufügen, wird Mitarbeiter im Team, etw hinzugefügt. wie folgt aus:

class Employee 
{
  // ...
  public void AddTeam(Team team)
  {
     // check for null, etc. 

     Teams.Add(team);
     team.Employees.Add(this);
  }
}

und sehr simillar Methode in der Team-Klasse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top