1

在我的項目中,所有的實體都有複合主鍵[systemId只要,deviceId只要,id一樣長]。在保存實體之前,手動填寫值。 我正在使用「代碼優先」的方法,並提供簡單的引用NHibernate.Mapping.Attributes擴展來定義具有屬性的模式,就像在基於Java的Hibernate中一樣。NHibernate複合標識映射問題,雙向/單向OneToMany,ManyToOne和ManyToMany

所有實體具有一個抽象基類,其提供共享屬性和功能:

[Serializable] 
public abstract class EntityBase 
{ 

    [CompositeId(0, Name = "id", ClassType = typeof(EntityId))] 
    [KeyProperty(1, Name = "systemId", Column = "restId")] 
    [KeyProperty(2, Name = "deviceId", Column = "deviceId")] 
    [KeyProperty(3, Name = "id", Column = "id")] 
    private EntityId id = new EntityId(); // this is a component, see below 

    [Property(Column = "isDeleted", NotNull = true)] 
    private bool deleted = false; 

    public EntityId Id 
    { 
     get { return id; } 
     set { id = value; } 
    } 

    public bool Deleted 
    { 
     get { return deleted; } 
     set { deleted = value; } 
    } 

} 

複合ID後面有一個部件,它代表了複雜的主鍵:

[Serializable] 
[Component] 
public class EntityId 
{ 

    [Property(Column = "restId", NotNull = true)] 
    private long systemId = 0; 

    [Property(NotNull = true)] 
    private long deviceId = 0; 

    [Property(NotNull = true)] 
    private long id = 0; 

    public long SystemId 
    { 
     get { return systemId; } 
     set { systemId = value; } 
    } 

    public long DeviceId 
    { 
     get { return deviceId; } 
     set { deviceId = value; } 
    } 

    public long Id 
    { 
     get { return id; } 
     set { id = value; } 
    } 

} 

我definied稱爲OTMList和OTMItem的兩個實體具有彼此的雙向OneToMany和ManyToOne關聯。

[Serializable] 
[Class] 
public class OTMList : EntityBase 
{ 

    [List(0, Cascade = "none", Generic = true, Lazy = CollectionLazy.True)] 
    [Key(1, Column = "id")] 
    [Index(2, Column = "id")] 
    [OneToMany(3, NotFound = NotFoundMode.Exception, ClassType = typeof(OTMItem))] 
    private IList<OTMItem> otmItems = new List<OTMItem>(); 

    public IList<OTMItem> OTMItems 
    { 
     get { return otmItems; } 
     set { otmItems = value; } 
    } 

} 

[Serializable] 
[Class] 
public class OTMItem : EntityBase 
{ 

    [ManyToOne(0, Name = "otmList", ClassType = typeof(OTMList), Column = "OTMListId", Cascade = "none", Lazy = Laziness.Proxy)] 
    private OTMList otmList = null; 

    public OTMList OTMList 
    { 
     get { return otmList; } 
     set { otmList = value; } 
    } 

} 

Hibernate映射XML文件包含以下信息:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping default-access="field" auto-import="true" assembly="NHibernateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="NHibernateTest.ListTest.OTM.OTMList, NHibernateTest"> 
    <composite-id class="NHibernateTest.Domain.EntityId, NHibernateTest" name="id"> 
     <key-property name="systemId" column="restId" /> 
     <key-property name="deviceId" column="deviceId" /> 
     <key-property name="id" column="id" /> 
    </composite-id> 
    <property name="deleted" column="isDeleted" not-null="true" /> 
    <list name="otmItems" lazy="true" cascade="none" generic="true"> 
     <key column="id" /> 
     <index column="id" /> 
     <one-to-many class="NHibernateTest.ListTest.OTM.OTMItem, NHibernateTest" not-found="exception" /> 
    </list> 
    </class> 
    <class name="NHibernateTest.ListTest.OTM.OTMItem, NHibernateTest"> 
    <composite-id class="NHibernateTest.Domain.EntityId, NHibernateTest" name="id"> 
     <key-property name="systemId" column="restId" /> 
     <key-property name="deviceId" column="deviceId" /> 
     <key-property name="id" column="id" /> 
    </composite-id> 
    <property name="deleted" column="isDeleted" not-null="true" /> 
    <many-to-one name="otmList" class="NHibernateTest.ListTest.OTM.OTMList, NHibernateTest" column="OTMListId" cascade="none" lazy="proxy" /> 
    </class> 
</hibernate-mapping> 

當我驗證與NHibernate的,我得到以下異常的SchemaValidator模式:

Foreign key (FKF208BF0B9A2FCB3:OTMItem [OTMListId])) must have same number of columns as the referenced primary key (OTMList [restId, deviceId, id]) 

的問題是當我嘗試創建單向ManyToOne或雙向/單向ManyToMany關聯時也是如此。

有人可以幫我嗎?

完整的源代碼可在這裏:

NHibernateTest source code

回答