试图让我的头脑自动化。我在尝试自动化域并生成数据库时遇到问题。我确定它的一些简单的我做错了。
问题是,生成了正确的表,但是在生成的表中只存在基类的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; }
}
答案 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<>));