CompositeId原因无法编译映射文档错误

问题描述:

我正在尝试使用CompositeId映射到遗留系统。源数据库有一个复合主键,所以我不能使用正常的this.Id映射。CompositeId原因无法编译映射文档错误

这是我尝试它映射:

public PriorityListPartMap() 
{ 
    this.Schema("EngSchedule"); 

    this.Table("vPriorityListPart"); 

    this.CompositeId().KeyProperty(x => x.AssemblyPartNumber).KeyProperty(x => x.PartNumber); 

    this.Map(x => x.CurrentDueDate); 

    this.Map(x => x.OrderLine); 

    this.Map(x => x.OrderNumber); 

    this.Map(x => x.PartDescription); 

    this.Map(x => x.ProductCode); 

    this.Map(x => x.Revision); 
} 

当我尝试创建会话工厂这个映射导致错误: 无法编译映射文件:(XmlDocument的)

我试着

this.Id(x => x.AssemblyPartNumber).GeneratedBy.Assigned(); 

错误消失与映射,但我真的不能使用该罪:去除CompositeId映射,并取代了它AssemblyPartNumber不是唯一的。

是否有不同的方式映射到具有复合主键的表?

感谢,

马修·麦克法兰

什么是内部异常 “无法编译映射文件:(XmlDocument的)”?我的理论是这样的:“composite-id类必须覆盖Equals():YOURNAMESPACE.PriorityListPart”。

对于需要复合标识的实体,对象本身被用作关键字。为了使'相同'的对象被识别为这样,你需要重写Equals和GetHashCode方法。

一个实例的Equals对你的实体的方法是这样的:

public override bool Equals(object obj) 
{ 
    var other = obj as PriorityListPart; 

    if (ReferenceEquals(null, other)) return false; 
    if (ReferenceEquals(this, other)) return true; 

    return this.AssemblyPartNumber == other.AssemblyPartNumber && 
     this.PartNumber == other.PartNumber; 
} 

对你的实体的一个例子GetHashCode的方法是这样的:

public override int GetHashCode() 
{ 
    unchecked 
    { 
     int hash = GetType().GetHashCode(); 
     hash = (hash * 31)^AssemblyPartNumber.GetHashCode(); 
     hash = (hash * 31)^PartNumber.GetHashCode(); 

     return hash; 
    } 
} 

这也意味着,如果你想要检索一个对象,你不能有一个键来完成它。要使用组合键组件正确检索特定对象,您使用的键实际上就是对象的一个​​实例,组合键组件设置为您希望检索的实体。

这就是为什么必须重写Equals()方法的原因,以便NHibernate能够根据您在Equals方法中指定的内容来确定您实际尝试检索哪个对象。

+0

这是**辉煌的**!完美工作。我原来的错误没有内部异常,它是空的,但你的解决方案无论如何都是正确的。非常感谢您的帮助。 –

+0

完美的解决方案 - 适合我!我的实体由http://nmg.codeplex.com/创建,没有Equals。 – Henrik