Pregunta

Cuando pruebo mis muchos a muchas clases se produce un error:

  

System.ApplicationException: Actual   recuento no es igual a lo esperado recuento.

Entidades:

    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>();
        }
    }

Asignaciones:

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");
    }
}

Prueba:

[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();
}

Si añado un Empleado o un equipo de mi mesa EmployeeTeam siempre está vacía.

He probado contra SQLLite con HNF y de forma manual en SQL Server 2008.

¿Alguien de ustedes tiene una idea para solucionar este problema?

editar

Me sorprendió descubrir que cuando se crea un Empleado y añadir 2 Equipos para el Empleado y cargar el Empleado creado tiene 2 equipos. Por lo que funciona bien. Pero cuando miro en mi mesa relationsip EmployeeTeam entonces todo está vacía. Alguien me puede explicar por qué?

Y ¿Alguien sabe cómo puedo usar Fluido NHibernate para probar mi relación muchos a muchos?

Gracias de antemano!

¿Fue útil?

Solución

mapa

Empleado tiene atributo inversa. Como usted probablemente sabe, esto significa que cuando excepto los empleados, no se actualizará tabla de relación (EmployeeTeam). Para añadir / eliminar información nueva relación que se tiene que añadir empleado para el equipo y guardar equipo.

Así que, en su caso - no probar muchos a muchos en el lado del empleado, prueba de que en el lado del equipo. (Si desea NHibernate para agregar registros Al añadir equipo para los empleados, que tendrá que invertir atributos "inversas" - da a equipo, no empleado, pero luego - repite la historia de la entidad Team).

¿Por qué fue capaz de cargar con los equipos de los empleados? Debido a la caché de nivel de sesión. Es probable que haya guardado y cargado de empleado de la misma ISession - esto significa que NHibernate se volvió exactamente referencia al mismo objeto, sin carga desde la db. Intente guardar y carga en dos sesiones diferentes y verá ningún equipo en conjunto Employee.Teams.

Nota al margen: Se considera una buena práctica para crear métodos que harán cumplir la coherencia entre las relaciones de muchos a muchos, que es - cuando se agrega al equipo de empleados, se añade Empleado al equipo, algo. de esta manera:

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

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

y método muy simillar en la clase de equipo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top