NHibernate在不查询的情况下插入多个对象的多对多集合

时间:2015-06-30 15:19:38

标签: .net nhibernate fluent-nhibernate many-to-many hql

我们说我有这个数据模型:

public class User {
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
}

public class Vehicle {
  public virtual int Id { get; set; }
  public virtual ICollection<User> TrackingUsers { get; set; }
  public virtual Category Category { get; set; }
}

public class Category {
  public virtual int Id { get; set; }
  public virtual ICollection<Vehicle> Vehicles { get; set; }
}

和这个映射:

    public VehicleMap()
    {
        Table("Vehicles");

        Map(x => x.Id);
        References(x => x.Category);            

        HasManyToMany(x => x.TrackingUsers)
                    .AsSet()
                    .Table("UsersToVehicles")
                    .LazyLoad()
                    .ParentKeyColumn("VehicleId")
                    .ChildKeyColumn("UserId");
    }

    public UserMap()
    {
        Table("Users");

        Map(x => x.Id);
        Map(x => x.Name);
    }

    public CategoryMap()
    {
        Table("Categories");

        Map(x => x.Id);
        HasMany(x => x.Vehicles);
    }

每辆车只能放在一个类别中,但可以由多个用户跟踪,每个用户可以跟踪多辆车。

我想要实现的是允许用户设置跟踪&#39;所有类别车辆的状态。 这意味着对于类别中的每个车辆,我需要将User实例添加到TrackingUsers集合中。

显然,我不想查询所选类别中的所有车辆。是否有任何HQL或标准查询?

1 个答案:

答案 0 :(得分:1)

您无法使用HQL或Criteria执行此操作,但您应该可以使用本机sql执行此操作。

session.CreateSQLQuery(@"INSERT INTO UsersToVehicles (VehicleId, UserId)
                         SELECT VehicleId, :userId 
                         FROM Vehicles WHERE CategoryId = :categoryId")
       .SetInt32("userId", userId)
       .SetInt32("categoryId", categoryId)
       .ExecuteUpdate();

但是,不要考虑在用户和类别之间添加TrackingUsers关系。这将允许自动跟踪新添加的车辆到一个类别。