Свободное владение nhibernate Домен Трудности - PullRequest
1 голос
/ 18 апреля 2011

Пытаюсь свалить голову с автопробега.У меня возникла проблема при попытке автоматизировать мой домен и создать базу данных.Я уверен, что это что-то простое, я делаю неправильно.

Проблема в том, что сгенерированы правильные таблицы, но в сгенерированных таблицах присутствует только поле идентификатора из базового класса, и никакие другие поля внутри сущностей не сгенерированы.

BaseEntityнаходится в другом пространстве имен для сущностей.

Я не уверен, куда идти отсюда, какие-либо идеи?

Вот моя конфигурация отображения:

public static ISessionFactory CreateSessionFactory()
{
  return _sessionFactory = Fluently.Configure()
    .Database(ConfigureDatabase())
    .Mappings(m => m.AutoMappings.Add(CreateMappings()))
    .ExposeConfiguration(BuildSchema)
    .BuildSessionFactory();
}

private static IPersistenceConfigurer ConfigureDatabase()
{
  return MsSqlConfiguration
    .MsSql2008.ShowSql()
    .ConnectionString(c => c.FromAppSetting("MSSqlConnectionString"))
    .ProxyFactoryFactory<ProxyFactoryFactory>();
}

private static AutoPersistenceModel CreateMappings()
{
  return AutoMap.AssemblyOf<Organisation>(new AutomappingConfig())
    .Conventions.Add<CascadeConvention>();
}

private static void BuildSchema(Configuration config)
{
  new SchemaUpdate(config)
    .Execute(false,true);
}

Вот мойautoMappingConfig

public class AutomappingConfig : DefaultAutomappingConfiguration
{
  public override bool ShouldMap(Type type)
  {
    return type.Namespace == "Domain.Model" && type.IsClass;
  }
}

И все мои сущности наследуют этот базовый класс:

public class BaseEntity<T> where T : BaseEntity<T>
{
  public virtual int Id { get; set; }
}

И пример сущности:

public class Contact : BaseEntity<Contact>, IAggregateRoot
{
  public virtual String Name { get; set; }
  public virtual Organisation Organisation { get; set; }
}

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

BaseEntity находится в другом пространстве имен для сущностей.

Что вы можете сделать, это попробовать поместить их в одно и то же пространство имен. Также вы можете закомментировать чек, который у вас есть выше:

return type.Namespace == "Domain.Model" && type.IsClass;

Приведенное выше утверждение может быть причиной того, что вы отображаете только свои базовые классы. В каком пространстве имен находится ваш базовый класс, и в каком пространстве имен находятся ваши примеры объектов?

Когда я сталкиваюсь с такими проблемами, я пытаюсь упростить вещи, пока не выясню, что вызывает мои проблемы.

Редактировать:

После дальнейших исследований, я думаю, вам нужно использовать следующее:

.IgnoreBase(typeof(BaseEntity<>));  

Таким образом, ваш код выше будет изменен на:

private static AutoPersistenceModel CreateMappings()
{
  return AutoMap.AssemblyOf<Organisation>(new AutomappingConfig())
    .Conventions.Add<CascadeConvention>()
    .IgnoreBase(typeof(BaseEntity<>));
}

Это выдержка из FNH Wiki :

Мы добавили IgnoreBase вызов, который просто инструктирует автомат для игнорирования класса Entity; Вы можете связать этот звонок столько раз по мере необходимости.

С этим изменением мы теперь получаем наши желаемое отображение. Сущность игнорируется как Беглое дело касается NHibernate, и все свойства (Id в нашем дело), ​​как если бы они были на конкретные подклассы.

0 голосов
/ 18 апреля 2011

С Автоматическое сопоставление: базовый тип как стратегия наследования :

Абстрактные базовые классы

Вы заметите, что наш класс Entity Аннотация. Это хорошая практика, но для записи, это не обязательно. Если у вас возникли проблемы, это вряд ли это будет.

На случай, если вам интересно, аннотация класса все равно что сказать "я никогда не создавайте это напрямую, вместо этого я создаст производные классы, такие как Клиент и заказ (которые наследуются от Entity). "

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

AutoMap.AssemblyOf<Entity>(cfg)
  .IncludeBase<BaseEntity>();

AutoMap.AssemblyOf<Entity>(cfg)
  .IncludeBase(typeof(BaseEntity<>));

Артикул: Автоматическое отображение базовых базовых классов

...