NHibernate устанавливает внешний ключ во вторичном обновлении, а не при первоначальном вставить нарушение ограничения Not-Null в ключевом столбце

У меня проблема с тем, что должно быть довольно простым (как мне кажется) вариантом использования NHibernate.

I имеют классические родительские и дочерние сущности, например:

public class Parent 
{
    public virtual int ParentId { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Child> Children { get; set; }
}

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

И сопоставления следующим образом:

public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.ParentId).GeneratedBy.Native();
        Map(x => x.Name);
        HasMany(x => x.Children).KeyColumn("ParentId").Cascade.SaveUpdate();
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Id(x => x.ChildId).GeneratedBy.Native();
        Map(x => x.Name);
        References(x => x.Parent).Column("ParentId").ReadOnly().Not.Nullable();
    }
}

Наконец, у меня есть простые тесты:

   [Test]
    public void Test_save_family()
    {
        var parent = new Parent();
        var child = new Child {Parent = parent};
        parent.Children = new List<Child>{child};

        SessionManager.WithSession(
            session =>
                {
                    session.Save(parent);
                    session.Flush();
                });

    }

Тест не проходит с System.Data.SqlClient.SqlException: невозможно вставить значение NULL в столбце «ParentId». Это верно в том смысле, что столбец не допускает значения NULL, но почему он вставляет NULL?

Если я удалю ограничение NULL, сохранение работает, потому что NHibernate сначала вставляет родительский элемент, затем вставляет дочерний элемент, а затем обновляет столбец ParentId в столбце дочерняя запись, как показано в этом выводе:

NHibernate: INSERT INTO [Parent] (Name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = NULL
NHibernate: INSERT INTO [Child] (Name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = NULL
NHibernate: UPDATE [Child] SET ParentId = @p0 WHERE ChildId = @p1;@p0 = 2, @p1 = 1

Мне это кажется странным, поскольку почти во всех случаях столбцы внешнего ключа такого типа объявлены не допускающими значения NULL, и, следовательно, внешний ключ должен быть предоставлен при вставке. Так почему же NHibernate не устанавливает внешний ключ при начальной вставке дочерней строки и как это исправить?

6
задан Kenneth Baltrinic 30 November 2010 в 16:27
поделиться