2015-05-04 2 views
1

У меня возникли проблемы с получением взаимно-однозначных отношений, работающих с белым 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 на объекте ребенка со значением от родителя, но ребенок на самом деле не сохраняется в БД и не генерируется ошибка.

Любая идея, что я делаю неправильно?

ответ

1

Ничего. Я чувствую себя глупо. Сопоставления верны, но вы должны перенести Сохранить в транзакцию для дочернего объекта, который должен сохраняться, чего я не делал в своем тестовом приложении. Как только я добавил транзакцию, он работал, как ожидалось.

Смежные вопросы