如何将 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 与实体中相同类型的多个列表一起使用? 的相关文章

  • nhibernate:读写字符串列表

    我知道我可以使用 nhibernate 读取写入字符串列表 如下所示 HasMany x gt x Attachments KeyColumn RowId Table PostTable Element PostKey 但这会创建一个额外的
  • NHibernate - 无法延迟初始化角色集合

    我有以下看似简单的场景 但我对 NHibernate 仍然很陌生 当尝试在我的控制器上加载以下模型以进行编辑操作时 控制器的编辑操作 public ActionResult Edit Guid id return View reposito
  • NHibernate 和 DateTime 映射的问题

    我在查询时遇到问题 我在给定的范围内选择记录 时间跨度 我从中选择的列的类型为日期 我已经映射了这个 列作为 DateTime 属性 查询可以工作 但速度很慢 生成的查询如下所示 由NH分析器 http nhprof com select
  • 如何在 NHibernate 查询中仅选择几列?

    我有一个一类到一表的映射 不幸的是 这个表有 110 多个列 查询需要很长时间 尤其是大多数时候我只想查看 我的问题是查询是根据用户想要查看的内容动态生成的 我无法真正使用不同的列创建不同的映射 因为会有大量的组合 我正在使用条件 API
  • NHibernate 克服 NotSupportedException

    有谁知道有什么方法可以克服 NotSupportedException 我有一个针对用户的方法 public virtual bool IsAbove User otherUser return HeirarchyString Starts
  • NHibernate代理异常

    我是新 NHibernate 我正在编写一个简单的应用程序 其中的客户类包含 id 和名称 并使用 nhibernate 将对象存储到数据库中 但我得到以下信息 未配置 ProxyFactoryFactory 使用可用的 NHibernat
  • 在 nhibernate 标准中使用内置的 sql“转换”函数

    我想利用 SQL Server 2008 中的 Convert 函数 以便可以在 DateTime 列上进行搜索 建议的 SQL 看起来像这样 SELECT list of fields FROM aTable WHERE CONVERT
  • 无法转换类型为“NHibernate.Collection.Generic.PersistentGenericBag”的对象

    public List
  • 保存时的 NHibernate FlushMode

    我已将 NHibernate 会话上的 FlushMode 属性设置为 FlushMode Never 但是当我调用 session Save User 时 无论如何都会调用数据库 这是应该如何工作的吗 我认为在我调用 Flush 之前它不
  • Breeze + NHibernate 多对一关系,避免指定关系键

    以下多对一映射正在运行 取自 NorthBreeze public partial class UserRole public virtual long ID get set public virtual long UserId get s
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • NHibernate:将一个类映射到两个相同的表

    我需要将一个实体映射到两个表 Invoice 和 InvoiceHistory 我不能将两个数据库表合并为一个并添加一个状态列来区分它们 这两个表具有完全相同的结构 但是 正如名称所示 InvoiceHistory 保留旧发票的历史记录 而
  • 如何使用 NHibernate 和 Fluent NHibernate 存储未截断的 varchar(max) 字符串

    我的数据库模式有一个 varchar max 字符串 我读过另一本问题 https stackoverflow com questions 2343105 override for fluent nhibernate for long te
  • MSTest 和 NHibernate

    有谁有让 MSTest 将 hibernate cfg xml 正确复制到输出目录的经验吗 我的所有 MSTest 都因找不到 hibernate cfg xml 错误而失败 我将其设置为 始终复制 但我的 MBUnit 测试通过了 您可以
  • 如何告诉 NHibernate 始终强制引用标识符?

    正如标题 我如何一劳永逸地告诉NHibernate 所有表名和列名都将在它生成的SQL 中引用 您还可以尝试 SchemaMetadataUpdater QuoteTableAndColumns configuration
  • 尽管 HQL 获取,Nhibernate 仍然生成代理

    我有以下 HQL 语句 select distinct t from TaskEntity as inner join fetch t Case as c inner join fetch c Client as client inner
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen
  • 如何在 Nhibernate 中进行版本控制?

    我不敢相信让别人向我展示一个简单的工作示例是如此困难 这让我相信每个人都只能说得好像他们知道如何去做 但实际上他们并不知道 我将帖子缩短为仅我想要示例执行的操作 也许帖子太长了 吓跑了人们 为了获得这个赏金 我正在寻找一个可以在 VS 20
  • Hibernate 乐观锁..它是如何工作的?

    我正在阅读下面关于休眠乐观锁定的博客 我打算将它与休眠一起使用 但是 我有一个担忧 我们有java代码和c 代码 都连接到一个数据库 虽然java代码可以使用hibernate来实现乐观锁定 但我想让c 代码做同样的事情 此外 C 代码正在

随机推荐

  • 如何将覆盖视图放在操作栏 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