2012-02-11 60 views
2

我定义主键如下:外键的表2列主键(CompositeId)

CompositeId() 
    .KeyProperty(x => x.Id) 
    .KeyProperty(x => x.Type); 

我已经试过如下:

References(x => x.EntityWith2ColsPK); 

并与失败:

外键(Fk_MyEntity_EntityWith2ColsPK:MyEntities [Fk_EntityWith2ColsPK]))必须具有相同数目的所引用的主键列(EntityWith2ColsPKs [Id,Type])

如何从另一个实体引用EntityWith2ColsPK?


更新:

我以下(根据AlfeG的评论)尝试:

HasMany<EntityWith2ColsPK>(x => x.EntityWith2ColsPK).KeyColumns.Add("Id", "Type").Cascade.All(); 

与失败:

自定义类型未实现UserCollectionType:EntityWith2ColsPK

但无论如何我不想要一对多的关系,我想要一个1对1的关系。不过,我不能让他们任何一个工作。

而且,我已经试过:

HasOne<EntityWith2ColsPK>(x => x.EntityWith2ColsPK).PropertyRef(x => x.Id).PropertyRef(x => x.Type); 

哪些失败:

NHibernate.MappingException:找不到属性:在实体类型EntityWith2ColsPK

我能做些什么这真的有用吗?


我设法达到的分贝东西..不过不失,由于某种原因,我怀疑它的属性“类型”映射了两次,因为我希望它是主键的两部分,一部分外键.. 这是我做过什么:

References(x => x.EntityWith2ColsPK).Columns("EntityWith2ColsPKId", "Type").Formula("Id = :EntityWith2ColsPKId AND Type = :Type"); 

但我收到以下异常:

System.IndexOutOfRangeException:无效的指数8此SqlParameterCollection以计数= 8。

因为这个实体的映射是一样的EntityWith2ColsPK:

CompositeId() 
    .KeyProperty(x => x.Id) 
    .KeyProperty(x => ((ILocalizedEntity) x).Language); 

HELP!

+0

它的重复使用问题,像这样http://stackoverflow.com/questions/4460648/how-to-map-composite-主键到外来流利-nhibernate所以你可以通过这个链接找到anser – AlfeG 2012-02-11 12:49:13

+0

这并不能解决我的问题:( – 2012-02-11 15:26:01

回答

2

你可以因为你没有使用级联反正您Reference

References(x => x.EntityWith2ColsPK) 
    .Columns(new string[] { "ID", "TYPE" }) 
    .Not.Update() 
    .Not.Insert(); 
+1

非常感谢你,我花了整个周末来研究这个问题,没有成功..我很积极我尝试了你给我的东西,同时改变了其他东西,但它失败了..现在它工作:)再次感谢。 – 2012-02-11 23:14:43

+0

您可能想要将数据库中的列名(如果可以的话)更改为id和type之外的其他名称。例如,在一个名为'order'的表中,您可能会有一个名为'order_id'的列。 – 2012-02-12 03:24:37

+0

我遇到了问题...因为我想要更新和插入“OrderID”,但Type不能再次映射(因为Type已经是CompositeId的一部分),所以它仍然没有解决 – 2012-02-12 20:33:12