6

私のエンティティには、いくつかの理由で主キーがありません:

public partial class VehicleLocation
{
    public virtual string UserCode { get; set; }
    public virtual string DateTime { get; set; }
    public virtual string Device { get; set; }
    public virtual string Gps { get; set; }
    public virtual string GpsDateTime { get; set; }
    public virtual double Speed { get; set; }
}

マッピング:

class VehicleLoactionMap : ClassMap<VehicleLocation> 
{
    public VehicleLoactionMap()
    {
        Table("VEHICLE_LOCATION");
        LazyLoad();
        Map(x => x.UserCode).Column("USER_CODE");
        Map(x => x.DateTime).Column("DATE_TIME");
        Map(x => x.Device).Column("DEVICE");
        Map(x => x.Gps).Column("GPS");
        Map(x => x.GpsDateTime).Column("GPS_DATE_TIME");
        Map(x => x.Speed).Column("SPEED");
    }
}

このエラーが発生しました:

エンティティ「VehicleLocation」には ID がマップされていません...

主キーを使用せずにエンティティをマップするにはどうすればよいですか?

4

3 に答える 3

9

私はしばらく前に同じ問題を抱えていましたが、多くの検索の結果、識別子フィールドのないエンティティを nHibernate にマップすることはできないことがわかりました。

ただし、一意の識別子の代わりに複合キーを使用することで、これを行うことができます。私自身は試していませんが。

これは、あなたに役立つかもしれない同様の質問への回答です。

于 2013-04-04T09:39:09.287 に答える
2

NHibernate は各エンティティに一意の識別子を必要とするため、これを行う方法はありません。これは、NHibernate がデータベース テーブル内のデータの行をエンティティに結び付ける方法を必要とするためです。これができない場合、エンティティ データに対して何らかの形で永続化を実行する方法はありません。

テーブルに主キーが 1 つもない状況では、2 つの方法が考えられます。

  1. 複合主キーを使用します。

  2. DBMS がサポートしている場合は、物理行識別子を使用できます。SQL Server 2008 には が%%physloc%%あり、Oracle にはROWID.

しかし、ほとんどすべてのシナリオでオプション 2 をお勧めしません。これは、DBMS が行 ID が行の有効期間にわたって同じままであるという保証を行わないためであり、そのため非常に信頼性の低い主キーです。

于 2013-04-04T10:04:02.100 に答える
1

複合キーを簡単に作成できます。コードサンプル (VB):

Table("Table1")
CompositeId().KeyProperty(Function(x) x.Field1).KeyProperty(Function(x) x.Field2)
于 2015-04-29T14:11:41.973 に答える