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. 如果您的 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 回答