我有两个理论域对象:
公共类人员 { 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作为它的主键?
答案 0 :(得分:1)
您可以使用复合ID键吗? http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-compositeid http://nhibernate.info/doc/nh/en/index.html#components-compositeid
答案 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 );
}
}