具有2列主键(CompositeId)的表的外键

时间:2012-02-11 10:59:57

标签: c# nhibernate fluent-nhibernate foreign-keys primary-key

我已将主键定义如下:

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对多的关系,我想要一对一的关系。不过,我无法使其中任何一个工作。

另外,我试过了:

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:此SqlParameterCollection的索引8无效,Count = 8.

因为此实体的映射与EntityWith2ColsPK相同:

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

HELP!

1 个答案:

答案 0 :(得分:2)

您可以使用类似的内容,因为您还没有在Reference

上使用级联
References(x => x.EntityWith2ColsPK)
    .Columns(new string[] { "ID", "TYPE" })
    .Not.Update()
    .Not.Insert();