Fluent nhibernate自动映射域困难

Fluent nhibernate自动映射域困难,nhibernate,fluent-nhibernate,automapping,Nhibernate,Fluent Nhibernate,Automapping,试着让我的头脑清醒过来。我在尝试自动映射我的域并生成数据库时遇到问题。我确信这很简单,我做错了 问题是,生成了正确的表,但生成的表中只存在基类中的ID字段,而实体中的其他字段都没有生成 BaseEntity与实体位于不同的命名空间中 我不知道该怎么办,有什么想法吗 以下是我的映射配置: public static ISessionFactory CreateSessionFactory() { return _sessionFactory = Fluently.Configure()

试着让我的头脑清醒过来。我在尝试自动映射我的域并生成数据库时遇到问题。我确信这很简单,我做错了

问题是,生成了正确的表,但生成的表中只存在基类中的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);
}
我的所有实体都继承了这个基类:

public class BaseEntity<T> where T : BaseEntity<T>
{
  public virtual int Id { get; set; }
}
公共类BaseEntity,其中T:BaseEntity
{
公共虚拟整数Id{get;set;}
}
以及一个示例实体:

public class Contact : BaseEntity<Contact>, IAggregateRoot
{
  public virtual String Name { get; set; }
  public virtual Organisation Organisation { get; set; }
}
公共类联系人:BaseEntity,IAggregateRoot
{
公共虚拟字符串名称{get;set;}
公共虚拟组织{get;set;}
}
来自:

抽象基类

您会注意到我们的实体类是 摘要这是很好的做法,但是 作为记录,这不是强制性的。 如果你遇到问题,那就是 不太可能是这样

如果你想知道的话 课堂摘要就像说“我会 永远不要直接创建它,而是我 将创建派生类,例如 客户和订单(从 实体)。”

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

AutoMap.AssemblyOf(cfg)
.IncludeBase();
自动装配(cfg)
.包括基础(基本实体的类型);
第条:

BaseEntity与实体位于不同的命名空间中

您可能想做的是尝试将它们放在同一名称空间中。此外,您可能需要对上述支票进行注释:

return type.Namespace == "Domain.Model" && type.IsClass;
上面的语句可能是导致您只映射基类的原因。您的基类在哪个命名空间中,您的示例实体在哪个命名空间中

当我遇到这样的问题时,我会尽量简化事情,直到我发现是什么导致了我的问题

编辑:

经过进一步研究,我认为您需要使用以下工具:

.IgnoreBase(typeof(BaseEntity<>));  
.IgnoreBase(typeof(BaseEntity));
因此,您的上述代码将更改为:

private static AutoPersistenceModel CreateMappings()
{
  return AutoMap.AssemblyOf<Organisation>(new AutomappingConfig())
    .Conventions.Add<CascadeConvention>()
    .IgnoreBase(typeof(BaseEntity<>));
}
private static AutoPersistenceModel CreateMappings()
{
返回AutoMap.AssemblyOf(新的AutomappingConfig())
.Conventions.Add()
.IgnoreBase(类型(基本实体));
}
这是摘自:

我们已经添加了IgnoreBase 调用,它只是指示 自动映射以忽略实体类; 您可以多次链接此呼叫 根据需要

有了这个变化,我们现在可以 所需的映射。实体被忽略为 目前为止,尼伯内特所关心的是, 以及我们的 案例)被视为处于打开状态 特定的子类


您的其他类是否可能与“Organization”不在同一程序集中?@sjonny它们肯定在同一程序集中。您使用的是FNH和NH的哪个版本?谢谢您的输入。那么,如何将基类作为一个类型的BaseEntity包含进来,.IncludeBase();不工作我更改了自动映射以包含基本实体,但它仍然只在表中生成ID。有点卡住了,不知道该怎么办?谢谢您的帮助。@cole w很抱歉延迟回复,我已经尝试了您的建议,但仍然得到相同的结果,为每个类创建了一个表,但只在中包含Id字段。@geepie查看我上面的编辑,看看这是否对您有帮助。我可以复制您看到的内容,这为我解决了问题。@geepie无论何时尝试重新生成架构,我都会首先从数据库中删除旧表。除非我先删除了它们,否则我在这方面遇到了问题。我同意,
IgnoreBase
可能是需要的,而不是
IncludeBase
。我无法想象@geepie会希望他的DB模式包含BaseEntity及其子类之间的继承关系。如果每个表都加入到一个单独的表中,从而列出所有id,这是没有帮助的。@Cole W感谢您的编辑,我会考虑到这一点,然后再试一次。
.IgnoreBase(typeof(BaseEntity<>));  
private static AutoPersistenceModel CreateMappings()
{
  return AutoMap.AssemblyOf<Organisation>(new AutomappingConfig())
    .Conventions.Add<CascadeConvention>()
    .IgnoreBase(typeof(BaseEntity<>));
}