我用Fluent NHibernate做了一件非常基本的事情。我在这里找到了很多有类似问题的人,但似乎都没有解决我的问题。
我有1个类:
public abstract class ParentClass
{
public virtual long Id { get; private set; }
public virtual DateTime CreateDate { get; set; }
public virtual int Type { get; set; }
}
和1个具体类如:
public class ChildClass : ParentClass
{
public virtual string PropertyX { get; set; }
public virtual int PropertyY{ get; set; }
}
所以我做了如下映射:
public class ParentMap : ClassMap<ParentClass>
{
public ParentMap()
{
Id(x => x.Id);
Map(x => x.CreateDate);
DiscriminateSubClassesOnColumn("Type");
}
}
和
public class ChildMap : SubclassMap<ChildClass>
{
public ChildMap()
{
Extends<ParentClass>();
DiscriminatorValue(1);
Map(x => x.PropertyX);
Map(x => x.PropertyY);
}
}
我的遗留数据库有2个表,1个保存来自ParentClass的所有数据,另一个保存来自Child的数据,其中包含ID中的外键。
我们的想法是为ParentClass的每个不同实现提供不同的表,但将ParentClass表作为&#34; Ids&#34;的单个存储库。和&#34;创建日期&#34;。
我按如下方式创建SessionFactory:
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlCeConfiguration.Standard.ConnectionString(cstr => cstr.FromConnectionStringWithKey("TheConnectionString")))
.Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<ParentClass>()
.ExportTo(@"c:\temp\Mappings"))
.BuildSessionFactory();
}
我正在做一个基本测试,将数据存储到数据库中:
public void Store(ParentClass parent)
{
using (var session = sessionFactory.OpenSession())
{
using (var transaction = session.BeginTransaction())
{
session.SaveOrUpdate(parent);
transaction.Commit();
}
}
}
但是尽管该方法等待一个ParentClass变量,我还是为它传递了一个ChildClass实例(该方法实际上是一个接口的继承,这就是为什么它需要一个ParentClass)。
每当我在&#34; SaveOrUpdate&#34;上出现错误时方法说&#34;没有持久性:ChildClass&#34;。
我做错了什么?
ps。:另一个奇怪的事情是即使使用&#34; ExportTo&#34;创建SessionFactory的方法,没有在文件夹上写入映射。
答案 0 :(得分:1)
更改
.Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<ParentClass>()
要
.Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<ParentMap>()