流利的nhibernate Automapping领域困难

时间:2011-04-18 00:17:18

标签: nhibernate fluent-nhibernate automapping

试图让我的头脑自动化。我在尝试自动化域并生成数据库时遇到问题。我确定它的一些简单的我做错了。

问题是,生成了正确的表,但是在生成的表中只存在基类的ID字段,实体中没有其他字段生成。

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 个答案:

答案 0 :(得分:3)

  

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   只是指示的电话   automapper忽略Entity类;   你可以多次链接这个电话   根据需要。

     

有了这个改变,我们现在得到了我们的   期望的映射。实体被忽略为   远离流利的NHibernate而言,   和所有的属性(我们的身份   案件)被视为已经开启   具体的子类。

答案 1 :(得分:0)

来自Automapping: base-type as an inheritance strategy

  

抽象基类

     

您会注意到我们的实体类是   抽象。这是一种很好的做法,但是   记录,它不是强制性的。   如果你遇到问题,那就是   不太可能是这个。

     

如果你想知道,制作   课堂抽象就像是在说“我会   永远不要直接创建,而是我   将创建派生类,如   客户和订单(继承自   实体)。“

     

默认行为是考虑   抽象类作为图层超类型   并且有效地取消映射,您可能想要   为特定场景更改此设置。   最简单的方法是使用   IncludeBase,其中T是你的   实体。

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

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

文章:Auto-mapping generic base classes