流畅的 NHibernate compositeid 到映射类

2024-01-02

我试图弄清楚如何使用 CompositeId 来映射另一个类。这是一个测试用例:

表格:

TestParent:
  TestParentId (PK)
  FavoriteColor

TestChild:
  TestParentId (PK)
  ChildName (PK)
  Age

C# 中的类:

public class TestParent
{
    public TestParent()
    {
        TestChildList = new List<TestChild>();
    }

    public virtual int TestParentId { get; set; }
    public virtual string FavoriteColor { get; set; }
    public virtual IList<TestChild> TestChildList { get; set; }
}

public class TestChild
{
    public virtual TestParent Parent { get; set; }
    public virtual string ChildName { get; set; }
    public virtual int Age { get; set; }

    public override int GetHashCode()
    {
        return Parent.GetHashCode() ^ ChildName.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        if (obj is TestChild)
        {
            var toCompare = obj as TestChild;
            return this.GetHashCode() != toCompare.GetHashCode();
        }
        return false;
    }
}

Fluent NHibernate 映射:

public class TestParentMap : ClassMap<TestParent>
{
    public TestParentMap()
    {
        Table("TestParent");
        Id(x => x.TestParentId).Column("TestParentId").GeneratedBy.Native();
        Map(x => x.FavoriteColor);

        HasMany(x => x.TestChildList).KeyColumn("TestParentId").Inverse().Cascade.None();
    }
}

public class TestChildMap : ClassMap<TestChild>
{
    public TestChildMap()
    {
        Table("TestChild");
        CompositeId()
            .KeyProperty(x => x.ChildName, "ChildName")
            .KeyReference(x => x.Parent, "TestParentId");

        Map(x => x.Age);
        References(x => x.Parent, "TestParentId");  /**  breaks insert **/
    }
}

当我尝试添加新记录时,出现以下错误:

System.ArgumentOutOfRangeException: 指数超出范围。必须是 非负且小于 集合。参数名称:索引

我知道此错误是由于 TestParentId 列在 CompositeId 和 References 调用中映射所致。但是,删除 References 调用会在基于 TestParentId 查询 TestChild 时导致另一个错误。

这是执行查询的代码:

var session = _sessionBuilder.GetSession();
using (var tx = session.BeginTransaction())
{
    // create parent
    var p = new TestParent() { FavoriteColor = "Red" };
    session.Save(p);

    // creat child
    var c = new TestChild()
                {
                    ChildName = "First child",
                    Parent = p,
                    Age = 4
                };
    session.Save(c);  // breaks with References call in TestChildMap 

    tx.Commit();
}

// breaks without the References call in TestChildMap 
var children = _sessionBuilder.GetSession().CreateCriteria<TestChild>()
    .CreateAlias("Parent", "p")
    .Add(Restrictions.Eq("p.TestParentId", 1))
    .List<TestChild>();

关于如何为此场景创建组合键有什么想法吗?


我找到了一个更好的解决方案,允许查询和插入。关键是更新 TestChild 的映射以不插入记录。新地图是:

public class TestChildMap : ClassMap<TestChild>
{
    public TestChildMap()
    {
        Table("TestChild");
        CompositeId()
            .KeyProperty(x => x.ChildName, "ChildName")
            .KeyReference(x => x.Parent, "TestParentId");

        Map(x => x.Age);
        References(x => x.Parent, "TestParentId")
            .Not.Insert();  //  will avoid "Index was out of range" error on insert
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流畅的 NHibernate compositeid 到映射类 的相关文章

  • Elasticsearch 关于“空索引”的查询

    在我的应用程序中 我使用了几个elasticsearch索引 它们在初始状态下不包含索引文档 我认为这可以称为 空 该文档的映射是正确且有效的 该应用程序还有一个包含实体的关系数据库 这些实体可能具有在 elasticsearch 中关联的
  • 覆盖默认的 Fluent NHibernate 列映射

    我正在尝试找到更改 Fluent NHibernate 自动映射行为的语法 我将如何修改下面的代码来映 射UserId属性到名为用户标识符 举个例子 public class MyTypeMap ClassMap
  • nHibernate + wcf + Isession

    我有一个包含 3 个项目的 C 解决方案 数据 WCF 和 UI 第一个是与数据库对话的类库 它通过第二个项目公开 该项目的类型为 WCF 服务库 原因是它将在第三个项目 称为 UI 的 Asp net 应用程序 作为指向 dll 的简单
  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 使用按位运算符时的 HQL 到 CriteriaQuery

    如何将其转换为 CriteraQuery select n from TagRegistration t join t Tag n where t Status status gt 0 order by count t ID desc n
  • NHibernate - CreateCriteria 与 CreateAlias

    假设以下场景 class Project public Job Job class Job public Name 假设我想使用 Criteria API 搜索其 Job 名称为 sumthing 的所有项目 我可以使用 CreateAli
  • 从架构上来说,我应该如何用更易于管理的内容替换非常大的 switch 语句?

    EDIT 1 忘记添加嵌套属性曲线球 UPDATE 我选择了 mtazva 的答案 因为这是我的具体案例的首选解决方案 回想起来 我用一个非常具体的例子提出了一个一般性问题 我相信这最终让每个人 或者也许只是我 对问题到底是什么感到困惑 我
  • 如何使用 Fluent NHibernate 自动映射来映射字典?

    我有一个像这样的实体 public class Land public virtual IDictionary
  • 流畅的 Nhibernate AutoMapping 继承和忽略抽象属性

    我有一个已成功映射的继承结构 产品 基础 PdfProduct 继承自Product 和OtherProduct 继承自Product 这些工作正常 我之前用 hbm xml 文件做过类似的事情 在上一个项目中 当我试图找出产品是什么类型时
  • 如何在基于其他数据帧的数据帧中创建联接?

    我有 2 个数据框 一份包含学生批次详细信息 另一份包含分数 我想加入 2 个数据框 数据框1包含 s1 s2 s3 Stud1 Stud2 Stud3 Stud2 Stud4 Stud1 Stud1 Stud3 Stud4 数据框2包含
  • 如何在 NHibernate 查询中仅选择几列?

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

    有什么办法可以让 NHibernate 使用吗the READPAST hint https learn microsoft com en us sql t sql queries hints transact sql table从 SQL
  • NHibernate HQL 相当于 T-SQL 的 TOP 关键字

    NHibernate HQL 相当于 T SQL 的 TOP 关键字是什么 另外 用非 HQL 方式说 给我一门课的前 15 个 是什么意思 在 HQL 中这实际上非常简单 var top15 session CreateQuery fro
  • NHibernate:如何从会话缓存中获取实体实例?

    我在工作单元开始时开始会话 并在工作单元结束时关闭 工作单元分布在多种方法中 在一种方法中 我使用加载实体Get方法 所以它位于会话缓存中 实体实例对于方法来说是本地的 因此 当方法范围结束时 实体实例将无法访问 但实体仍在会话缓存中 现在
  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • 免费用于商业用途的google-maps相当于执行以下操作吗?

    我正在寻找一个地图 API 它具有与 Google 地图类似的功能 但可能具有 Apache MIT 许可证的某些内容 我基本上想在地图上绘制点 这样的事情存在吗 如果有的话 有没有关于在这个地图 API 上绘制点的指南 打开街道地图 ht
  • 我可以在 NHibernate QueryOver 中使用 SQL 函数吗?

    我一直在互联网上搜索 但找不到有关如何使用 nhibernate 3 0 的 queryover 的示例 例如 我想在查询的 where 子句中使用字符串函数 前任 var item Query Where x gt x Name ToLo
  • 在nhibernate中设置聚集索引

    我试图在 nhibernate 中定义一个不是 id 的属性作为聚集索引 但我发现没有办法做到这一点 谁能给我指点一下这是如何完成的 或者它是当前在 nhibernate 中不可用的东西 提前致谢 您可以使用
  • 更改 NHibernate Session.Save 命令超时

    我们有几个长时间运行的后端进程 其运行时间超过默认的 30 秒 我们的NHibernate版本是2 0 1 4000 Spring NET是1 2 0 20313 NHibernate 通过 Spring NET 进行配置
  • Sql 2008 文件流与 NHibernate

    我试图在 sql server 2008 中使用 Filestream 来存储用户上传的图像 我的问题是NHibernate不会出错 但它也不会将数据保存到数据库中 没有创建记录 下面的 Image 类是一个自定义类 不要与 System

随机推荐

  • 应用程序可以被反编译吗?

    我需要将网站特定部分的身份验证信息编码到我的应用程序中 应用程序是否有可能被 反编译 并暴露用户名和密码 NSURL url NSURL URLWithString https predefinedUsername email protec
  • Azure DevOps gulp 步骤失败,找不到本地模块

    我有一个 Azure DevOps 构建步骤 为 angularjs 应用程序运行 gulp 我将 Gulp 文件路径设置为指向GulpFile js引用的任务应捆绑应用程序并将文件放入解决方案文件夹中的 zip 文件中 当我在 Visua
  • 如何设置 Amazon S3、回形针和 ENV 变量

    我尝试了许多不同的方法来使用 ENV 变量设置 S3 进行图像上传 但无法使其工作 我知道我的密钥和存储桶名称有效 因为当我将它们直接放入代码中时 我的图像会正确上传 但是 当我尝试切换到 ENV 变量时 事情不起作用 我使用了 Figar
  • 谷歌图表不显示轴标签

    这不适用于图像图表 我有以下代码可以生成正确的图表 但标签不显示 图表 div 位于另一个 div 中 该 div 用作我的页面上的选项卡 当我在未选择包含图表的选项卡时运行该函数时 图表将显示为没有标签 当我在选择选项卡的情况下运行该函数
  • android UDP连接,没有接收到任何数据

    我是这方面的新手 所以如果我问愚蠢的问题 请原谅我 我试图在 Eclipse 的 PC 模拟器和 Android 手机之间建立 UDP 连接 或两个 Android 手机设备之间 我有一个router并且手机通过路由器的 wifi 网络连接
  • 如何在 SQLAlchemy 中创建带有外键列表的字段?

    我正在尝试在另一个模型的字段中存储模型列表 下面是一个简单的例子 我有一个现有的模型 Actor 我想创建一个新模型 Movie 与场Movie list of actors import uuid from sqlalchemy impo
  • 使用 Angular ui-grid 时的列标题换行

    我已将我的 AngularJS SPA 应用程序从ng grid v2 0 7 to ui grid v3我的列标题不再环绕 我的列标题现在是单行并显示省略号 当列标题不适合时 此功能是否已被删除或者是否已被其他方法取代 我相信我已经找到了
  • SQL Server 2005 中的等周

    在 SQL Server 2008 中 可以通过以下方式找到 isoweek SELECT datepart iso week getdate 在 SQL Server 2008 之前 没有内置函数来查找 isoweek 我一直在寻找一个好
  • 如何同时使用多个键提取字典值?

    我遇到了以下问题 dict1 a 1 b 2 c 3 d 4 正常检索方法 dict1 a gt 输出 gt 1预期方法 dict1 a b gt 输出 gt 1 2 我的要求是通过同时提供多个键从字典中提取多个值 如上面预期方法中所述 有
  • 从 EST/EDT 转换为 GMT

    如何将日期时间从 EST EDT 转换为 GMT 但我不知道代码将在哪里运行 未知的本地时区 也不知道节省时间 你要TimeZoneInfo ConvertTimeToUtc http msdn microsoft com en us li
  • 找不到文件“obj\Debug\Program.exe.manifest”

    如果之前已经回答过这个问题 我们深表歉意 我的 VS2010 SP1 VB NET 环境发生了一些问题 我已经通过 ClickOnce 成功地编译和发布了项目 A 一段时间 然后尝试发布项目 B 并收到了错误 在文件 microsoft c
  • EJB 3.1 和 NIO2:监控文件系统

    我想我们大多数人都同意 NIO2 是一个很好用的东西 假设您想要监视文件系统的某些部分以获取传入的 xml 文件 现在这是一项简单的任务 但是 如果我想将这些东西集成到现有的 Java EE 应用程序中 这样我就不必启动另一个服务 应用程序
  • 如何通过复选框启用和禁用 DataGridView 中的特定行?

    我试图通过选中和取消选中 gridview 内的复选框来启用和禁用 DataGridView 中的特定行 C Windows 应用程序 我尝试使用 CellClick 事件 但未按预期工作 这是我尝试过的代码 private void da
  • Javascript removeEventListener 不在类内工作[重复]

    这个问题在这里已经有答案了 我一直在玩 es6 类 并尝试设置一个简单的鼠标类 addEventListener有效 但由于某种原因我无法删除它们removeEventListener 我猜这与上下文绑定有关 但我不知道如何解决这个问题 u
  • 如何访问共享库中的文件?

    我有一个带有 groovy 脚本的共享库 我在 jenkinsfile 中调用该脚本 如下所示 MySharedLibFunction some args 我的共享库中还有一个我想要执行的 ps1 文件 但如果我这样做powershell
  • 如何为 UIPickerView 行设置 Voice Over 辅助功能标签?

    我正在尝试使我的 Voice Over 的 UIPickerView 可访问 我注意到 UIPickerViewAccessibilityDelegate 协议相当不完整 它只允许您指定 pickerView 组件的标签和提示 而不是组件内
  • Junit4运行测试类固定次数并显示结果(eclipse)

    我希望能够运行测试类指定的次数 该类看起来像 RunWith Parameterized class public class TestSmithWaterman private static String args private sta
  • 如何使 Ionic 4 ion-col 高度相同

    我有一个带有主卡片的页面 其中包含网格内的其他小卡片 我希望所有列都具有相同的高度 这将是特定行内列之间的最大高度 这是我的模板和我的样式
  • iPhone : (id)copyWithZone:(NSZone *)zone :“区域”是什么?

    在类中实现 NSCopying 的此方法以启用复制时 区域参数使用什么 如果我设置一个新对象 我不需要用 allocWithZone 分配它 因为分配就足够了 我很困惑 这是过去的遗物 我们有多个 区域 来分配 如今 所有应用程序只有一个区
  • 流畅的 NHibernate compositeid 到映射类

    我试图弄清楚如何使用 CompositeId 来映射另一个类 这是一个测试用例 表格 TestParent TestParentId PK FavoriteColor TestChild TestParentId PK ChildName