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 关系。这将允许自动跟踪新添加的车辆到一个类别。
假设我有这个数据模型:
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 关系。这将允许自动跟踪新添加的车辆到一个类别。