nhibernate流利映射复合ID

时间:2011-05-19 12:54:31

标签: nhibernate fluent-nhibernate

我正在学习使用流利的nhibernate,并且无法理解如何创建我的映射。我有一个具有多列主键的表,但我无法正确映射它。我有以下流畅的映射 -

public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity>
    {
        public void Override(AutoMapping<MyEntity> mapping)
        {
            mapping.CompositeId()
                .KeyProperty(x => x.Id_1, "Id_1")
                .KeyProperty(x => x.Id_2, "Id_2");

            mapping.References(x => x.otherEntity)
                .Column("JoinColumn");

            // Commented out to attempt to map to another entity on multiple columns
            //mapping.HasMany(x => x.thirdEntit)
            //    .KeyColumns.Add("thirdId_1", "thirdId_2")
            //    .Cascade.All();



        }
    }

我遇到的问题是复合ID似乎不起作用。

以下是生成的映射文件的片段 -

<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="identity" />
    </id>

然后我得到一个错误,即在查询的任何表中找不到列(id)。

我认为我的映射代码会产生正确的复合ID我错了吗?我错过了什么或做错了什么吗?

1 个答案:

答案 0 :(得分:3)

建议(并且我已经取得了很多成功),如果您正在使用CompositeKeys,则按照以下方式使用ID对象:

NHibernate and Composite Keys

在你的情况下,你要创建一个新类......

[Serializable]
public MyEntityIdentifier
{
   public virtual TYPE Id_1;
   public virtual TYPE Id_2;

   // You need to override Equals(MyEntityIdentifier), Equals(object obj) and GetHashCode()
}

然后您的映射变为

public class MyEntityMappingOverride : IAutoMappingOverride<MyEntity>
{
        public void Override(AutoMapping<MyEntity> mapping)
        {
            mapping.CompositeId()
                .ComponentCompositeIdentifier(x => x.MyEntityIdentifier)
                .KeyProperty(x => x.MyEntityIdentifier.Id_1, Id_1, "Id_1")
                .KeyProperty(x => x.MyEntityIdentifier.Id_2, "Id_2");

            // snip
        }
}

您的课程从拥有两个属性(Id_1和Id_2)到拥有MyEntityIdentifier。

然后在需要加载时使用MyEntityIdentifier ..

MyEntity entity = Session.Load<MyEntity>(new MyEntityIdentifier { Id_1 = Whatever, Id_2 = Whatever });

如果您对此数据库有任何控制权,我强烈建议您不要使用CompositeKeys。虽然NHibernate肯定会处理它们,但它们会带来一些额外的心理复杂性和问题。