2010-03-29 3 views
3
My Entity Class: 
public class Building 
    { 
     /// <summary> 
     /// internal Id 
     /// </summary> 
     public virtual long Id { get; set; } 
.............. 
} 

Мой Mapping:Автоотображение не имеет идентификатора отображается

var model = AutoMap.AssemblyOf<Building>() 
         .Setup(s => s.FindIdentity = p => p.Name == "Id") 
         .Where(t => t.Namespace == "SpikeAutoMappings"); 

var database = Fluently.Configure() 
         .Database(DatabaseConfigurer) 
         .Mappings(m=>m.AutoMappings.Add(model)); 

Мне нужен кто-то, чтобы помочь мне увидеть, что это неправильно, потому что я постоянно имея эту ошибку при запуске модульного тестирования:

Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 

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

ответ

0

Мой опыт работы с Автоотображение является то, что до тех пор, как ваш класс Entity имеет строку:

public virtual int Id { get; private set; } 

автомат будет рассматривать его как идентификатор без дополнительной помощи программиста (т. нет необходимости в коде FindIdenity, который вы используете в своем вызове AutoMap).

Единственное отличие, которое я вижу в объявлении идентификатора, заключается в том, что вы используете тип long вместо int. Не знаю, это или нет.

+1

Thx Tom. Я использую Oracle 10g и Id длинный тип. Пробовал вашу линию и вынул настройку FindIdentity ... по-прежнему получал ту же ошибку .... – Gini

1

Как правило, использование AutoMapping является плохой политикой, так как поданная Id должна существовать в ваших таблицах базы данных. Вместо этого рассмотрите возможность использования плавного генератора картирования, такого как NMG для обработки вашего сопоставления.

В этом случае вы должны сначала загрузить/установить приложение, а затем сгенерировать файлы сопоставления из своей базы данных (Oracle, SQL и другие).

Чтобы создать файлы сопоставления, сначала создайте в своем проекте папку /Entities/. Далее настройте программное обеспечение генератора следующим образом:

предпочтения

  1. Сформировано Имя свойства = То же, что имя столбца базы данных (без изменений)
  2. Mapping Style = Fluent Mapping
  3. поля или свойства = Авто Недвижимость

Доступные языки: C# и VB

  1. Папка: [your project folder]\Entities
  2. Пространство имен: [your project namespace].Entities
  3. Имя сборки: [your project name].Entities

Далее, либо генерировать все или Генерирование конкретную таблицу.

Все файлы *.cs и *Map.cs должны быть созданы в вашем проекте (вы можете добавить их с помощью Add Existing Item..., если они не отображаются).

Использование Fluent, вы увидите что-то вроде следующего:

Id(x => x.keyName_ID) 
    .Column(x => x.keyname_ID) 
    .GeneratedBy 
    .Sequence("keyname_ID") 

или

Id(x => x.keyName_ID) 
    .Column(x => x.keyname_ID) 
    .GeneratedBy 
    .Identity() 
    .Column("keyname_ID") 

или

Id(x => x.keyName_ID) 
    .Column(x => x.keyname_ID) 
    .GeneratedBy 
    .Assigned() 

Итак, теперь нам нужно указать Id с помощью FluentMapping с Fluent nHibernate. Для этого вам необходимо перезаписать строку Id по коду в каждом из файлов Map в решении. Просто добавьте:

Id(x => x.KeyName_ID) 
    .GeneratedBy 
    .GetGeneratorMapping() 
    .IsSpecified("KeyName_ID"); 

Где keyname_id это имя столбца в id в базе данных, а не один созданный.

Обратите внимание, что в вашем отображении на BuildSession вы должны иметь:

(...).Mappings(m => 
    m.FluentMappings.AddFromAssemblyOf<[one of your entities]>() 
); 

И теперь Id отображается. :) Надеюсь, это поможет!

9

оба вышеперечисленные ответы являются правильными; если вы не укажете иначе, автоперпер предполагает, что у вас есть int Id-поле.
Если ваш идентификатор длинный, автомат может не распознать его правильно.
попробовать определения MappingOverride для вашего класса (ов), например, так: функция

public class UserMappingOverride : IAutoMappingOverride<User> 
{ 
    #region IAutoMappingOverride<User> Members 

    public void Override(AutoMapping<User> mapping) 
    { 
     mapping.Id(u => u.Name); 
    } 

    #endregion 
} 

Ид() позволяет отменить соглашение в automapper в того, что поле ID должно быть.
для получения дополнительной информации об переопределении, см. http://wiki.fluentnhibernate.org/Auto_mapping#Overrides.
Cheers,
Jhonny