C# ActiveRecord:检索不同会话中的现有实体
我使用的是Castle ActiveRecord 3.0,从数据库中获取对象引用时遇到问题。当我在同一会话范围内获取多个实体时,我会获取相关实体的相同对象引用。但通常我无法使用同一会话范围来获取所需的所有对象。这很难描述,所以这里有一个例子:C# ActiveRecord:检索不同会话中的现有实体,c#,nhibernate,activerecord,C#,Nhibernate,Activerecord,我使用的是Castle ActiveRecord 3.0,从数据库中获取对象引用时遇到问题。当我在同一会话范围内获取多个实体时,我会获取相关实体的相同对象引用。但通常我无法使用同一会话范围来获取所需的所有对象。这很难描述,所以这里有一个例子: [ActiveRecord(Table = "car")] public class Car : ActiveRecordLinqBase<Car> { [PrimaryKey("id")] public virtual int
[ActiveRecord(Table = "car")]
public class Car : ActiveRecordLinqBase<Car>
{
[PrimaryKey("id")]
public virtual int Id { get; set; }
[OneToOne(PropertyRef = "Car", Cascade = CascadeEnum.SaveUpdate)]
public virtual Location Location { get; set; }
}
[ActiveRecord("location")]
public class Location : ActiveRecordLinqBase<Location>
{
[PrimaryKey(Column = "id")]
public virtual int Id { get; set; }
[BelongsTo("car_id", NotFoundBehaviour = NotFoundBehaviour.Ignore,
Cascade = CascadeEnum.SaveUpdate)]
public virtual Car Car { get; set; }
}
[ActiveRecord(Table = "move_order")]
public class MoveOrder : ActiveRecordLinqBase<MoveOrder>
{
[PrimaryKey(Column = "id")]
public virtual int Id { get; set; }
[BelongsTo(Column = "car_id")]
public virtual Car Car { get; set; }
[BelongsTo(Column = "destination_id")]
public virtual Location Destination { get; set; }
}
然后,如果我为同一辆车/同一地点创建两个移动订单,它就可以正常工作了:
MoveOrder moveOrder;
MoveOrder moveOrder2;
using (new SessionScope())
{
moveOrder = new MoveOrder()
{
Destination = Location.Queryable.First(x => x.Car == null),
Car = Car.Queryable.First();
};
moveOrder2 = new MoveOrder()
{
Destination = Location.Queryable.First(x => x.Car == null),
Car = Car.Queryable.First()
};
}
对于以下对象,对象引用是相等的:
- moveOrder.汽车,moveOrder.汽车
- moveOrder.Location,moveOrder2.Location
using (new SessionScope())
{
moveOrder = new MoveOrder()
{
Destination = Location.Queryable.First(x => x.Car == null),
Car = Car.Queryable.First()
};
}
及
这些属性中没有一个是引用相等的,但逻辑上它们是相同的实体。
我还尝试获取Nhibernate会话并将所有分离的对象关联回新会话:
using (var sess = GetSession())
{
sess.Lock(moveOrder.Destination, LockMode.Read);
sess.Lock(moveOrder.Car, LockMode.Read);
moveOrder2 = new MoveOrder()
{
Destination = sess.Get<Location>(moveOrder.Destination.Id),
Car = sess.Get<Car>(moveOrder.Car.Id),
};
}
使用(var sess=GetSession())
{
sess.Lock(moveOrder.Destination,LockMode.Read);
sess.Lock(moveOrder.Car,LockMode.Read);
MoveOrder 2=新的MoveOrder()
{
Destination=sess.Get(moveOrder.Destination.Id),
Car=sess.Get(moveOrder.Car.Id),
};
}
在这种情况下,这确实起到了作用,但也存在一些问题:
- 我必须将当前使用的每个数据库实体传递给新会话
- 我无法使用查询、会话。获取ID的工作
cache=CacheEnum.ReadWrite
,但没有结果
我不想一直开着同一个会议
using (new SessionScope())
{
moveOrder2 = new MoveOrder()
{
Destination = Location.Queryable.First(x => x.Car == null),
Car = Car.Queryable.First()
};
}
using (var sess = GetSession())
{
sess.Lock(moveOrder.Destination, LockMode.Read);
sess.Lock(moveOrder.Car, LockMode.Read);
moveOrder2 = new MoveOrder()
{
Destination = sess.Get<Location>(moveOrder.Destination.Id),
Car = sess.Get<Car>(moveOrder.Car.Id),
};
}