“使用Fluent NHibernate中Subclass的Fluently映射”“没有持久性”

时间:2010-12-29 04:13:31

标签: fluent-nhibernate

我用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的方法,没有在文件夹上写入映射。

1 个答案:

答案 0 :(得分:1)

更改

.Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<ParentClass>()

.Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<ParentMap>()