Свободное автоматическое сопоставление NHibernate PrimaryKey Имя свойства не является "Id" - PullRequest
1 голос
/ 19 мая 2011

Я пытаюсь перейти на Fluent NHibernate и у меня возникает следующая проблема: (

У меня есть несколько классов, названных в виде CompanyXXXXXX, у всех из которых есть PrimaryKey «CompanyId», который имеет тип Company.

Файл отображения HBM, который я использовал, пока имя не было таким:

  <class name="CompanyAccounting" table="Company_Accounting" >
    <id column="CompanyID" type="Int32">
      <generator class="foreign">
        <param name="property">Company</param>
      </generator>
    </id>
    <one-to-one name="Company" constrained="true" />
  </class>

Сущность выглядит следующим образом:

public class CompanyAccounting
{
    public virtual Company Company {get;set;}        
}

Можно ли использовать какую-то функцию автоматического сопоставления, поскольку у меня есть дюжина этих классов, и, вероятно, их будет больше.

Я пробовал следующее:

    public class CustomPrimaryKeyConvention : IIdConvention
    {
        public void Apply(IIdentityInstance instance)
        {
            var type = instance.EntityType;
            if (type.Name.StartsWith("Company") && type.Name.Length > 7)
            {
                instance.CustomType(typeof(Company));
                instance.Column("CompanyId");
            } 
            else
            {
                instance.Column(instance.EntityType.Name + "Id");
            }
        }
    }

РЕДАКТИРОВАТЬ: Но мой If (...) [Для типа "CompanyAccounting"] даже не получил удар. Есть предложения?

Исключение:

The entity 'CompanyAccounting' doesn't have an Id mapped. 
Use the Id method to map your identity property. For example: Id(x => x.Id).

1 Ответ

1 голос
/ 19 мая 2011

Вы зарегистрировали это соглашение в Fluent Nhibernate?

У вас должно быть что-то вроде

AutoMap.AssemblyOf<CompanyAccounting>()
       .Conventions.AddFromAssemblyOf<CustomPrimaryKeyConvention>()
...