由于某些原因,我的实体没有主键:
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映射...
如何在不使用主键的情况下映射我的实体?
答案 0 :(得分:8)
我前段时间遇到了同样的问题,但经过大量搜索后,我发现在nHibernate中没有映射到没有标识符字段的实体是不可能的。
但是你可以通过使用复合键而不是唯一标识符来实现。虽然我自己没有尝试过。
Here是对可能对您有帮助的类似问题的答案。
答案 1 :(得分:2)
由于NHibernate需要每个实体的唯一标识符,因此无法执行此操作。这是因为NHibernate需要一种方法将数据库表中的一行数据绑定到实体。如果它不能做到这一点,那么它就无法对实体数据执行任何形式的持久性。
在表没有单个主键的情况下,我找到了两种可行的方法。
使用复合主键。
如果您的DBMS支持,您可以使用物理行标识符。 SQL Server 2008有%%physloc%%
,Oracle有ROWID
。
但我几乎不会在任何情况下推荐选项2。这是因为DBMS不保证行id在行的生命周期内保持不变,因此是非常不可靠的主键。
答案 2 :(得分:1)
轻松创建复合键。 代码示例(VB):
Table("Table1")
CompositeId().KeyProperty(Function(x) x.Field1).KeyProperty(Function(x) x.Field2)