Я хочу перестроить базу данных в существующую кодовую базу с минимальными трудностями, используя 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, которые я пытался использовать для явного исключения этих полей, но, похоже, это не имеет никакого эффекта.Я оставил пример этой попытки в моем фрагменте кода выше.
Так что я думаю, у меня есть два вопроса:
- Как я могу сказать автопроизводителю игнорировать все, что я не помечаюс моим атрибутом?
- Если это невозможно, как проще всего сопоставить мои существующие объекты с базой данных, не создавая класс отображения для каждого объекта, который я хочу отобразить?
Заранее спасибо