У меня возникли проблемы с получением взаимно-однозначных отношений, работающих с белым nhibernate. Я прочитал множество сообщений по этому вопросу, и кажется, что предпочтительным подходом является метод общего первичного ключа, где родительский и дочерний имеют одинаковое значение первичного ключа, а дочерний PK также является FK для родителя.Fluent NHibernate один-к-одному с двунаправленным HasOne, не сохраняющим ребенка
Каждый родительский и дочерний классы имеют ссылку на другую (двунаправленную 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 (удалены некоторые ГСН краткости):
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 на объекте ребенка со значением от родителя, но ребенок на самом деле не сохраняется в БД и не генерируется ошибка.
Любая идея, что я делаю неправильно?