«Не использовать для» с использованием свободного отображения подкласса в Fluent NHibernate - PullRequest
1 голос
/ 29 декабря 2010

Я делаю очень простую вещь с 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 в папку не записывается сопоставление.

1 Ответ

1 голос
/ 12 сентября 2011

Изменение

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

Для

.Mappings(mappings => mappings.FluentMappings.AddFromAssemblyOf<ParentMap>()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...