NHibernate映射没有主键的实体

时间:2013-04-04 09:29:33

标签: nhibernate mapping

由于某些原因,我的实体没有主键:

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映射...

如何在不使用主键的情况下映射我的实体?

3 个答案:

答案 0 :(得分:8)

我前段时间遇到了同样的问题,但经过大量搜索后,我发现在nHibernate中没有映射到没有标识符字段的实体是不可能的。

但是你可以通过使用复合键而不是唯一标识符来实现。虽然我自己没有尝试过。

Here是对可能对您有帮助的类似问题的答案。

答案 1 :(得分:2)

由于NHibernate需要每个实体的唯一标识符,因此无法执行此操作。这是因为NHibernate需要一种方法将数据库表中的一行数据绑定到实体。如果它不能做到这一点,那么它就无法对实体数据执行任何形式的持久性。

在表没有单个主键的情况下,我找到了两种可行的方法。

  1. 使用复合主键。

  2. 如果您的DBMS支持,您可以使用物理行标识符。 SQL Server 2008有%%physloc%%,Oracle有ROWID

  3. 但我几乎不会在任何情况下推荐选项2。这是因为DBMS不保证行id在行的生命周期内保持不变,因此是非常不可靠的主键。

答案 2 :(得分:1)

轻松创建复合键。 代码示例(VB):

Table("Table1")
CompositeId().KeyProperty(Function(x) x.Field1).KeyProperty(Function(x) x.Field2)