使用NHibernate进行一对一映射/使用实体作为PK

时间:2009-07-13 17:16:50

标签: c# nhibernate fluent-nhibernate

我有两个理论域对象:

公共类人员     {         public virtual int Id {get;私人集; }     }

public class PersonMap : ClassMap<Person>
{
    public PersonMap() { Id( x => x.Id ); }
}

public class DriversLicense
{
    public virtual Person Person { get; set; }
    public virtual string State { get; set; }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
    public DriversLicenseMap()
    {
        References( x => x.Person );
        Map( x => x.State );
    }
}

将Person对象用作DriversLicense上的PK。我不希望Person对象具有DriversLicense的任何知识,因此关系在DriversLicense类中严格维护。每人只有一个DriversLicense。

以这种方式设置时,我遇到以下异常:

  

System.Xml.Schema.XmlSchemaValidationException:   命名空间中的元素“class”   'urn:nhibernate-mapping-2.2'有   无效的子元素'property'   命名空间   '瓮:NHibernate的映射-2.2'。清单   可能的元素:'meta,   jcs-cache,cache,id,composite-id'in   命名空间   '瓮:NHibernate的映射-2.2'

将Id属性添加到DriversLicense类型可以解决问题。

有没有办法使用Person本身作为DriversLicense表中的主键,以便底层表只使用Person.Id作为它的主键?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

@Matthieu用复合键让我走上了正确的轨道。我不得不使用UseCompositeId()方法然后覆盖Equals&amp; Get License对象的GetHashCode。

以下是流畅的NHibernate的外观:

public class DriversLicense
{
        public virtual Person Person { get; set; }
        public virtual string State { get; set; }

        public override bool Equals( object obj )
        {
            if( ReferenceEquals( obj, null ) ) return false;

            // Cast, instead of 'as' throws runtime exception when obj is not an 
            // DriversLicense.
            var comp = (DriversLicense) obj;

            if( Person == null || comp.Person == null )
                return false;

            return Person.Equals( comp.Person );
        }

        public override int GetHashCode() 
        {
            return Account == null ? -1 : Account.GetHashCode(); 
        }
}

public class DriversLicenseMap : ClassMap<DriversLicense>
{
        public DriversLicenseMap()
        {
                UseCompositeId().WithKeyReference( x => x.Person );
                Map( x => x.State );
        }
}