NHibernate 无需查询即可插入多个对象的多对多集合

NHibernate insert into a many-to-many collection for multiple objects without querying

假设我有这个数据模型:

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

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

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

显然我不想查询所选类别中的所有车辆。是否有任何 HQL 或条件查询可以这样做?

您不能使用 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 关系。这将允许自动跟踪新添加的车辆到一个类别。