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