我希望使用NHibernate和sqlite数据库将数据库改型为现有的代码库,并尽可能减少痛苦。我想通过使用AutoMapper为从自定义DatabaseObject类继承的任何对象映射用[DatabaseField]自定义属性标记的字段来解决此问题。标有[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'
作为记录,如果我删除此字段,则其他所有内容都将完全按照我的意愿进行映射。
我已阅读了有关我试图用来显式排除这些字段的Override和OverrideAll方法的信息,但它似乎没有任何作用。我在上面的代码片段中留下了这种尝试的示例。
所以我想我有两个问题:
预先感谢
答案 0 :(得分:0)
看看ignoring properties的文档。
您可以使用IgnoreProperty
方法。
.Override<Scan>(map =>
{
map.IgnoreProperty(x => x.ManufactureDate);
});
根据persistent classes的文档,实体中的所有属性/方法也都必须是虚拟的或实现接口。
NHibernate的主要特征(代理)取决于持久性 类未密封,其所有公共方法,属性和 声明为虚拟的事件。上课的另一种可能性是 实现一个声明所有公共成员的接口。