C# ActiveRecord:检索不同会话中的现有实体

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

我使用的是Castle ActiveRecord 3.0,从数据库中获取对象引用时遇到问题。当我在同一会话范围内获取多个实体时,我会获取相关实体的相同对象引用。但通常我无法使用同一会话范围来获取所需的所有对象。这很难描述,所以这里有一个例子:

[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
但当我使用不同的会话作用域来获取两个MoveOrder时:

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的工作
主要问题是:

如何实现每次获取相同实体(相同ID)时从DB获取相同对象引用?

还尝试使用Nhibernate二级缓存,方法是在AR init中配置它,并向每个db类ActiveRecord属性添加
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),
    };
}