1

1 つのオブジェクトにアイテムのコレクションがあり、コレクションに最後に追加されたアイテムへの参照を保持する必要があるため、次のようにしています。

public class VehicleMap : BaseUniqueNamedEntityMap<Vehicle>
    {
        public VehicleMap():
            base("vehicle_id", 40)
        {
            Not.LazyLoad();                

            //The main collection of items
            HasMany(x => x.mVehicleModels)                                        
                .OrderBy("date asc")
                .Cascade.AllDeleteOrphan()                    
                .LazyLoad()
                .KeyColumn("vehicle_id");

            //Always updated to the last added item
            References(x => x.mCurrentModel)
                .Column("current_vehicle_model_relation_id")
                .Cascade.None()
                .Not.Nullable();
        }
    }

Vehicle クラスは次のようになります。

  public class Vehicle : BaseUniqueNamedEntity
{        
    private IList<VehicleModelItem> mVehicleModels = new List<VehicleModelItem>();

    [NotNull()]
    private VehicleModelItem mCurrentModel;

    public VehicleModel Model
    {
        get { return mCurrentModel.VehicleModel; }

        set 
        {
            //Check null before checking if values change, so we catch exceptions on constructor also
            if (value == null)
                throw new ArgumentNullException("Vehicle model cannot be null");                

                //When model is set, we update current model and insert it on list
                mCurrentModel = new VehicleModelItem(this, value);
                mVehicleModels.Add(mCurrentModel);
                value.AddVehicleModelItem(mCurrentModel);                    
        }
    }          
}

VehicleModelItem マッピング:

public VehicleModelItemMap() :
            base("vehicle_model_relation_id")
        {
            Not.LazyLoad();                

            References(x => x.mVehicleModel)
                .Column("vehicle_model_id")
                .Cascade.None()
                .LazyLoad(Laziness.Proxy)
                .Not.Nullable();

            Map(x => x.mDate)
                .Column("date")
                .Not.Nullable();
        }

問題は、次のような新しい車両を作成する場合です。

Vehicle vehicle = new Vehicle();
vehicle.Model = anyExitingVehicleModel;

session.save(vehicle);

この場合、VehicleModelItem のプロパティ Vehicle に対して、「null または非 null プロパティに設定された一時オブジェクト」を取得します。

この問題は、車両の mCurrenveVehicleModel プロパティに関連しています。削除すると、すべてが機能しますが、最後に追加されたアイテムを追跡できませんでした (少なくともこの方法では)。

VehicleModelItem と vehicle の両方に対して save を呼び出す必要なく、これを機能させる方法はありますか?

これらのコレクションでカスケードの組み合わせをいくつか試しましたが、成功しませんでした。

ありがとうございました

4

1 に答える 1

0

VehicleMap を次のように変更してみてください。

public class VehicleMap : BaseUniqueNamedEntityMap<Vehicle>
{
    public VehicleMap():
        base("vehicle_id", 40)
    {
        Not.LazyLoad();                

        //The main collection of items
        HasMany(x => x.mVehicleModels)                                        
            .OrderBy("date asc")
            .Cascade.AllDeleteOrphan()                    
            .LazyLoad()
            .KeyColumn("vehicle_id")
            .Inverse();

        //Always updated to the last added item
        References(x => x.mCurrentModel)
            .Column("current_vehicle_model_relation_id")
            .Not.Nullable()
            .Not.Insert();
    }
}

これは、セッターに含めるのではなく、「参照」部分を手動で設定することを除いて、私が行うことと似ています。これの唯一の欠点は、'Inverse' が true に設定されているため、VehicleModelItem で親を手動で指定する必要があることです。コンストラクターがその参照を渡しているので、既にそれを行っていると思います。

于 2012-08-10T16:52:28.870 に答える