Я делаю очень простую вещь с Fluent NHibernate.Я нашел много людей с подобными проблемами здесь, в SO, но ни один из них, похоже, не решил мою проблему.
У меня есть 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 в качестве единого хранилища для «Идентификаторов».и «Создать даты».
Я создаю свой 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).
Икаждый раз, когда я это гвозникает ошибка в методе «SaveOrUpdate», говорящем «Нет персистента для: ChildClass».
Что я делаю не так?
пс .: Еще одна странная вещь - даже при использовании метода ExportToпри создании SessionFactory в папку не записывается сопоставление.