在询问此处之前,我阅读了有关该主题的所有帖子,但我找不到任何解决方案。
我删除了所有域名复杂性,我要回答以下简单问题:
我有2个类(在域文件Domain.cs中):
public abstract class BaseClass
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
}
public class ASubClass : BaseClass
{
public ASubClass() {}
public virtual string prop { get; set; }
}
我的映射是(在另一个文件Mapping.cs中):
public class BaseClassMap : ClassMap<BaseClass>
{
public BaseClassMap ()
{
Id(x => x.ID).GeneratedBy.HiLo("1000");
Map(x => x.Name);
DiscriminateSubClassesOnColumn("Type");
}
}
public class ASubClassMap : SubclassMap<ASubClass>
{
public ASubClassMap ()
{
Map(x => x.prop);
DiscriminatorValue(1);
}
}
首先我让NHibernate为我创建数据库:
var cfg = new NHibernate.Cfg.Configuration();
Fluently.Configure(cfg)
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(connectionstring)
.ShowSql())
.Mappings(m => m
.FluentMappings.AddFromAssemblyOf<BaseClass>()).BuildConfiguration();
new SchemaExport(cfg).Execute(false,true,false);
这很好用,然后我的单元测试如下: 我在存储库中构建了一个会话工厂,并使用Session / Transaction来尝试保存一个空的SubClass:
var contract = new ASubClass();
IRepository<ASubClass> repository = new Repository<ASubClass>();
repository.Add(contract); >>> BUG HERE
这实际上就是线路上的错误(在回购内部):session.Save(contract);
我尝试将Mapping.cs复制/粘贴到Domain.cs中或更改其属性
.FluentMappings.AddFromAssemblyOf<BaseClass>
至.FluentMappings.AddFromAssemblyOf<BaseClassMap>
我还试图通过删除 Discriminator 来改变子类的层次结构 DiscriminateSubClassesOnColumn 关键字。
到目前为止还没有工作。
感谢。
答案 0 :(得分:1)
你的代码实际上适合我。
您的配置或存储库必定存在问题,或者您在单元测试中如何使用配置+存储库。我的意思是,你创建了一个新的Repository,它是否使用你发布的配置? 100%肯定?
您是否正在使用cfg构建存储库使用的ISessionFactory
?例如
var factory = cfg.BuildSessionFactory();
也许检查所有映射是否在同一个程序集中,否则添加两个程序集。