Исключая приватные поля с беглым nhibernate - PullRequest
0 голосов
/ 17 октября 2018

Я хочу перестроить базу данных в существующую кодовую базу с минимальными трудностями, используя NHibernate и базу данных sqlite.Я хотел бы сделать это, используя AutoMapper для сопоставления полей, которые я помечаю, с пользовательским атрибутом [DatabaseField] для любого объекта, который наследуется от пользовательского класса DatabaseObject.Все, что отмечено пользовательским атрибутом [Cascade], будет каскадно.В данный момент у меня есть следующий код в тестовом проекте:

Объекты для сопоставления:

   class Scan : DatabaseObject
    {    
        [DatabaseField]
        public virtual string Name { get; set; }
        [DatabaseField]
        public virtual DateTime ScanDate { get; set; }
        [DatabaseField]
        [Cascade]
        public virtual Scanner Scanner { get; set; }

        public DateTime ManufactureDate { get; set; }
    }

    class Scanner : DatabaseObject
    {
        [DatabaseField]
        public virtual string Name { get; set; }
    }

Настройка сеанса:

    ProjectConfiguration pcfg = new ProjectConfiguration();



 var sessionFactory = Fluently.Configure()
        .Database(SQLiteConfiguration.Standard.UsingFile("theTestScannerDatabase.sqlite"))
        .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Scan>(pcfg)
        .Override<Scan>(x => x.IgnoreProperty(y => y.ManufactureDate)).Conventions.Setup(x => x.AddFromAssemblyOf<Scan>())))
        .ExposeConfiguration(BuildSchema)
        .BuildSessionFactory();
    return sessionFactory.OpenSession();

Объект конфигурации проекта

public class ProjectConfiguration : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Type type)
    {
        return type.BaseType == typeof(DatabaseObject);
    }

    public override bool ShouldMap(Member member)
    {
        return member.MemberInfo.GetCustomAttributes().Contains(new DatabaseField());
    }

}

Проблема связана с полем «ManufactureDate», которое автоматическое устройство попыталось отобразить, и огорчено, что оно не является виртуальным свойством, и подобные вещи случаются с частными свойствами.Я не хочу отображать каждое свойство моих объектов в базу данных.Я подумал, что об этом должны позаботиться теги и прочее в переопределениях ShouldMap.

Исключение:

InvalidProxyTypeException: The following types may not be used as proxies:
SQLiteTestingApp.Scan: method get_ManufactureDate should be 'public/protected virtual' or 'protected internal virtual'
SQLiteTestingApp.Scan: method set_ManufactureDate should be 'public/protected virtual' or 'protected internal virtual'

Для записи, если я удалю это поле, все остальные карты будут отображаться именно так, как я хочу.

Я прочитал о переопределении иМетоды OverrideAll, которые я пытался использовать для явного исключения этих полей, но, похоже, это не имеет никакого эффекта.Я оставил пример этой попытки в моем фрагменте кода выше.

Так что я думаю, у меня есть два вопроса:

  • Как я могу сказать автопроизводителю игнорировать все, что я не помечаюс моим атрибутом?
  • Если это невозможно, как проще всего сопоставить мои существующие объекты с базой данных, не создавая класс отображения для каждого объекта, который я хочу отобразить?

Заранее спасибо

1 Ответ

0 голосов
/ 17 октября 2018

Посмотрите документацию для игнорирования свойств .

. Вы можете использовать метод IgnoreProperty.

.Override<Scan>(map =>  
{  
  map.IgnoreProperty(x => x.ManufactureDate);
});

Все свойства / методы в объектетакже должны быть виртуальными или реализовывать интерфейс в соответствии с документацией для постоянных классов .

Центральная особенность прокси-серверов NHibernate зависит от того, является ли постоянный класс незамеченным и всеего публичные методы, свойства и события объявлены как виртуальные.Еще одна возможность для класса реализовать интерфейс, который объявляет все открытые члены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...