【发布时间】: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 属性,但子对象实际上并未保存到数据库中,也不会产生错误。
知道我做错了什么吗?
【问题讨论】: