排除熟练使用nhibernate的私人领域

时间:2018-10-17 09:35:54

标签: c# sqlite nhibernate fluent-nhibernate

我希望使用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方法的信息,但它似乎没有任何作用。我在上面的代码片段中留下了这种尝试的示例。

所以我想我有两个问题:

  • 如何告诉自动映射器忽略我没有使用属性标记的内容?
  • 如果不可能,那么将我现有的对象映射到数据库而又不为我要映射的每个对象创建映射类的最简单方法是什么?

预先感谢

1 个答案:

答案 0 :(得分:0)

看看ignoring properties的文档。

您可以使用IgnoreProperty方法。

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

根据persistent classes的文档,实体中的所有属性/方法也都必须是虚拟的或实现接口。

  

NHibernate的主要特征(代理)取决于持久性   类未密封,其所有公共方法,属性和   声明为虚拟的事件。上课的另一种可能性是   实现一个声明所有公共成员的接口。