Имя свойства Fluent NHibernate AutoMapping PrimaryKey не имеет идентификатора

Я пытаюсь перейти на 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;}        
}

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

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

    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");
            }
        }
    }

EDIT: Но мой 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).

person Michal Ciechan    schedule 19.05.2011    source источник


Ответы (1)


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

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

AutoMap.AssemblyOf<CompanyAccounting>()
       .Conventions.AddFromAssemblyOf<CustomPrimaryKeyConvention>()
person Chris Marisic    schedule 19.05.2011
comment
Привет, забыл упомянуть, что он не срабатывает для CompanyAccounting, он срабатывает для предыдущих классов, но он не вызывает метод Apply для CompanyAccounting, исключение срабатывает заранее. - person Michal Ciechan; 19.05.2011
comment
Значит, ваше соглашение работает для других классов, но не для CompanyAccounting? Находится ли CompanyAccounting в той же сборке, что и классы, для которых он работает? - person Chris Marisic; 19.05.2011
comment
да... я думаю, что проблема в том, что у CompanyAccounting нет общедоступного идентификатора {get; set;}, но я не знаю, как я могу сказать automapper не искать поле идентификатора, а вместо этого использовать поле компании. - person Michal Ciechan; 19.05.2011
comment
Да отвечает на какие вопросы? - person Chris Marisic; 20.05.2011
comment
@Chris, извините, да, CompanyAccounting находится в той же сборке, что и другие классы, и в том же пространстве имен. И соглашение работает для других классов, но когда я прохожу отладку, происходит сбой, как только он пытается выполнить инициализацию для CompanyAccounting. - person Michal Ciechan; 23.05.2011
comment
Я не совсем уверен, что думаю, вам стоит попробовать группу FNH. - person Chris Marisic; 23.05.2011