【问题标题】:Fluent NHibernate one-to-one with bidirectional HasOne not saving child流利的 NHibernate 一对一与双向 HasOne 不拯救孩子
【发布时间】:2015-05-04 15:50:24
【问题描述】:

我在使用 fluent nhibernate 建立一对一关系时遇到问题。我已经阅读了大量关于此的帖子,似乎首选方法是共享主键方法,其中父和子具有相同的主键值,并且子 PK 也是父的 FK。

父类和子类都具有对另一个的引用(双向 HasOne),并且子类被配置为从父类获取它的键值。

我相信我已经正确设置了它,但是当我创建一个新的父对象时,附加一个新的子对象然后尝试保存它,父对象正确保存并且键值在子对象上更新,但子对象没有实际保存到数据库中。

这里是类和地图:

public class Parent
{
    public virtual int ParentID { get; set; }
    public virtual string Name { get; set; }

    public virtual Child Child { get; set; }

    public virtual void Add(Child child)
    {
        child.Parent = this;
        Child = child;
    }
}

public class Child
{
    public virtual int ParentID { get; set; }
    public virtual string Name { get; set; }

    public virtual Parent Parent { get; set; }
}

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.ParentID).GeneratedBy.Identity();
        Map(x => x.Name);

        HasOne(x => x.Child).Cascade.All();
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Id(x => x.ParentID).GeneratedBy.Foreign("Parent");
        Map(x => x.Name);

        HasOne(x => x.Parent).Constrained().ForeignKey();
    }
}

这是 NHibernate 创建的架构(为简洁起见,删除了一些 GO):

CREATE TABLE [dbo].[Parent](
    [ParentID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
    [ParentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE TABLE [dbo].[Child](
    [ParentID] [int] NOT NULL,
    [Name] [nvarchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
    [ParentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[Child]  WITH CHECK ADD  CONSTRAINT [FK_ChildToParent] FOREIGN KEY([ParentID])
REFERENCES [dbo].[Parent] ([ParentID])
ALTER TABLE [dbo].[Child] CHECK CONSTRAINT [FK_ChildToParent]

所以它似乎创建了我期望的架构。但我就是不能救孩子:

var parent = new Parent() { Name = "Parent_1" };
parent.Add(new Child { Name = "Child_1" });
session.Save(parent);

如前所述,这将正确保存父对象并使用父对象的值更新子对象上的 ParentID 属性,但子对象实际上并未保存到数据库中,也不会产生错误。

知道我做错了什么吗?

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

    没关系。我觉得我好笨。映射是正确的,但是您必须将 Save 包装在事务中才能持久保存子对象,而我在测试应用程序中没有这样做。一旦我添加了交易,它就会按预期工作。

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多