如何将 Fluent NHibernate Automapping 与实体中相同类型的多个列表一起使用?

2024-03-27

看来 NHibernate 无法自动映射实体中给定类型的多个 IList。

考虑以下两个实体(基于 Fluent NHibernate 源代码中包含的 Examples.FirstProject 示例代码)。

public class Employee
{
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

public class Store
{
    public virtual int Id { get; private set; }
    public virtual IList<Employee> Staff { get; set; }
    public virtual IList<Employee> Managers { get; set; }
}

这似乎是一个完全有效的对象模型 - 每个商店都有几名员工和几名经理员工。

但是当我自动映射时,员工和经理列表存储在员工表中,所有列表都具有相同的外键。

Employee Table

Id FirstName LastName Store_id 
3  Daisy     Harrison   1 
4  Jack      Torrance   1 
5  Sue       Walkters   1 
6  Tom       Tommorow   1 
7  Dick      Diggler    1 

最终结果是,当从数据库中读回数据时,员工和经理列表都会填充every表中的行。

对我来说,这看起来像是 Automapping 中的一个错误,但我对任何形式的 NHibernate 都相当陌生,而且还不完全了解它的局限性。

任何状况之下,我怎样才能让 NHibernate 将这两个列表视为不同的?

如果可能的话,我希望有一个自动映射代码片段可以直接解决我提供的示例代码(例如“将这个精确的覆盖放在 CreateSessionFactory 的 .Mappings 部分中”)。

这是因为我对 Automapping 只是有些熟悉,而对旧的做事方式一点也不熟悉,这意味着我还不能很好地“填补空白”。

但如果你有时间为我指明正确的方向,那也会有帮助的。

这是我的 CreateSessionFactory 代码,提供一些上下文:

    private static ISessionFactory CreateSessionFactory()
    {
        ISessionFactory sessionFactory = null;

        const string autoMapExportDir = "AutoMapExport";
        if( !Directory.Exists(autoMapExportDir) )
            Directory.CreateDirectory(autoMapExportDir);

        try
        {
            var autoPersistenceModel = 
                AutoMap.AssemblyOf<Product>()
                        .Where(t => t.Namespace == "Examples.FirstProject.Entities")
                        .Conventions.Add( DefaultCascade.All() )
                ;

            sessionFactory = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard
                              .UsingFile(DbFile)
                              .ShowSql()
                         )
                .Mappings(m => m.AutoMappings.Add(autoPersistenceModel)
                                             .ExportTo(autoMapExportDir)
                         )
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory()
                ;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

        return sessionFactory;
    }

保罗·巴图姆回答了我的问题here http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/945b8bb9ddeebd4e?hl=en#,并提供了一个独立的工作示例here http://github.com/paulbatum/Fluent-NH-Test-Bed/commit/2eb8648360adfac5c59b1fcbbcd987ed55daa6bc(导航到链接页面后单击“下载”按钮)。

以下代码是从他的答案中复制的。关键点在于清单末尾的 StoreMap 类,该类使用Where子句设置了覆盖,该子句使用 Employee 中的 IsManager 属性。

请注意(至少在 v.1.0.0.594 中)Automapping 有一个大问题 -映射类(例如 StoreMap)不能与域类(例如 Store)位于同一命名空间中!

否则,NHibernate 将抛出“NHibernate.MappingException: (XmlDocument)(2,4): XML 验证错误: ...", 和 绝对没有表明真正的问题是什么或在哪里。

这可能是一个错误,可能会在 Fluent NHibernate 的更高版本中修复。

public class Employee 
{ 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual bool IsManager { get; set; } 
} 


public class Store 
{ 
    public virtual int Id { get; private set; } 
    public virtual IList<Employee> Staff { get; private set; } 
    public virtual IList<Employee> Managers { get; private set; } 


    public Store() 
    { 
        Staff = new List<Employee>(); 
        Managers = new List<Employee>(); 
    } 


    public void AddManager(Employee employee) 
    { 
        employee.IsManager = true; 
        this.Managers.Add(employee); 
    } 


    public void AddStaff(Employee employee) 
    { 
        this.Staff.Add(employee); 
    } 


} 

这是商店的映射覆盖:

// Must be in different Namespace from class Store!!!
public class StoreMap : IAutoMappingOverride<Store> 
{ 
   public void Override(AutoMapping<Store> mapping) 
   { 
       mapping.HasMany(x => x.Managers) 
           .Cascade.All() 
           .Where("(IsManager = 1)"); 
       mapping.HasMany(x => x.Staff) 
           .Cascade.All() 
           .Where("(IsManager = 0)"); 
   } 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Fluent NHibernate Automapping 与实体中相同类型的多个列表一起使用? 的相关文章

随机推荐

  • 如何将覆盖视图放在操作栏 Sherlock 上

    我想在操作栏上设置一些视图来显示教程文本 例如单击此处并发送电子邮件 这可能吗 我问是因为我知道操作栏使用布局上的顶部空间 而片段或活动使用剩余空间 我的第二个问题是如何在操作栏上显示所有操作项 我使用 ActionBarSherlock
  • Word 2011 VBA 中的文件对话框

    我希望能进行一些健全性检查 我正在为 Mac 改编一个 Word 加载项 用 VBA 为 Word 2010 编写 具体来说 此时为 Word 2011 我知道其中的许多差异 但我无法找到其中的差异很多文档都明显缺乏 FileDialog
  • 正则表达式匹配最多 9 位的整数

    我想创建一个正则表达式 其中只允许数字 最大长度为 9 没有最小长度 我想出了 d 9 0 9 但它不起作用 你很接近了 尝试这个 d 0 9 和 分别匹配文本的开头和结尾 d 0 9 匹配字符串中的任何位置 所以d0000会通过 因为它会
  • Sql Query帮助从两个表中获取不匹配的记录

    我正在尝试从 2 个表中获取不匹配的记录 For ex TableA ID Account 1 Acc1 2 Acc2 3 Acc3 TableB Opp Accountid Opp1 1 Opp2 2 Opp3 4 我需要知道哪个 acc
  • Gradle 的 PMD 插件:什么是可接受的参数?

    Java 1 7 0 40 摇篮1 10 我从未使用过 Gradle 的 PMD 插件 并且在尝试将规则集添加到我的项目时遇到了麻烦build gradle The Pmd 文档 http www gradle org docs curre
  • 在 Git 中使用替代 diff 算法

    Because git是为源代码设计的 它的默认值diff算法将线视为不可分割的最小单位 我正在尝试编辑一些在第 80 列自动换行的 Markdown 文件 添加句子可能会导致段落的其余部分被标记为已更改 有没有办法让 Git 使用更适合文
  • 使用 ssh 的 TRAMP 不会获取 .bash_profile / .profile

    我正在使用 Aquamacs 适用于 OSX 的图形 emacs 使用 emacs 24 和 ranp 版本 2 2 3 来编辑远程服务器上的一些文件 TRAMP 设置使用ssh并且在编辑文件方面工作得很好 编译失败是因为编译器不在路径中
  • bash 中的间接变量赋值

    似乎在 bash 中进行间接变量设置的推荐方法是使用eval var x val foo eval var val echo x gt foo 问题是常见的eval var x val 1 n pwd eval var val bad ou
  • C语言中的*和&有什么区别?

    我正在学习 C 但我仍然不确定我是否理解两者之间的区别 and yet 请允许我尝试解释一下 int a Declares a variable int b Declares a pointer int c Not possible a 1
  • JWT 令牌的最大大小是多少?

    我需要知道的最大长度 JSON Web 令牌 JWT 规格中没有相关信息 难道说 长度没有限制吗 我也一直在努力寻找这个 我会说 尝试并确保它是7kb 以下 虽然 JWT 在规范中没有定义上限 http www rfc editor org
  • Rmarkdown:在选项卡集下添加标题

    在 Rmarkdown 中我使用 tabset 将块拆分为选项卡 Tabset 1 tabset A Text under tab A B Text under tab B 我想在一些选项卡下添加一个大标题 Tabset 1 tabset
  • Java 中的 ArrayList 与 String

    我正在实现LZW算法 我已经成功地针对字符串和文本文件实现了它 并且当前正在修改我的代码以处理二进制文件 例如图像或可执行文件 因为我无法将这些文件作为字符串读取 我已经更换了String输入我的代码ArrayList
  • 如何在不使用 try-catch 的情况下检查路径是否有效?

    我想检查文件夹是否存在 如果不存在则创建它 但我不知道提供的路径是否有效 当路径无效时 会发生以下情况 string path this is an invalid path if Directory Exists path Directo
  • PayPal 的 Python 接口 - urllib.urlencode 非 ASCII 字符失败

    我正在尝试实现 PayPal IPN 功能 基本协议是这样的 客户从我的网站重定向到 PayPal 的网站以完成付款 他登录自己的帐户 授权付款 PayPal 调用我服务器上的一个页面 以 POST 形式传递详细信息 详细信息包括个人姓名
  • 上传的文件未保存到文件系统

    Context 我正在为我正在构建的 CMS 创建媒体库 基本功能包括上传文件并将其存储在文件系统中 但是 它会为保存的文件创建一个 id 目前我正在通过我构建的内容进行测试localhost db Files Add mediafile
  • Jira 插件自定义字段值如何在 .vm 模板中得到处理

    吉拉服务器 7 2 1 自定义字段插件 问题遵循此讨论 不明白 方法 getSingularObjectFromString 是做什么的 https stackoverflow com questions 17925377 cant und
  • Google表格公式中的数字增量

    在 Google Sheets 数据库中 我建立了一个公式 以便为一系列公司分配参考号 每个公司都应该有其唯一的编号 其形式为RET00XX其中 XX 代表唯一的公司编号 我希望这些数字是连续的 从 1 开始 然后继续 1 每当在数据库中插
  • Python 交换函数

    我很难用 Python 表达这一点 这是需要做什么的描述 swap cards int int 列表 gt NoneType swap cards 3 2 1 4 5 6 0 5 3 2 1 4 5 0 6 swap cards 3 2 1
  • 需要正则表达式来匹配多行,直到在公共分隔符之间找到匹配

    我正在尝试编写一个正则表达式 它将从日志文件返回多行匹配 使用下面的示例 我想匹配整个 事务 其开头和结尾与日志中所有其他事务 开始和结束 的文本相同 然而 在这些行之间有一个自定义标识符 在本例中是一个电子邮件地址 可以将一笔交易与另一笔
  • 如何将 Fluent NHibernate Automapping 与实体中相同类型的多个列表一起使用?

    看来 NHibernate 无法自动映射实体中给定类型的多个 IList 考虑以下两个实体 基于 Fluent NHibernate 源代码中包含的 Examples FirstProject 示例代码 public class Emplo