Пустой дочерний элемент в модели, ноль при сохранении со ссылками <> - PullRequest
1 голос
/ 19 июля 2011

У меня есть объект, объявленный как этот

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    public MyObject()
    {
        Child = new MyChild();
    }
}

public class MyChild
{
    public virtual long MyId { get; set; }
}

Я устанавливаю дочерний элемент с "пустым объектом", потому что я хочу пустой объект вместо нуля в моей модели.

В моей базе данных у меня есть таблица, подобная этой

CREATE TABLE MyObjects
(
    MyObjectId    bigint    IDENTITY(1,1) NOT NULL,
    ChildId       bigint    NULL
)

И затем в моем отображении

References<MyChild>(x => x.Child, "ChildId");

Вот где начинаются проблемы. Когда я пытаюсь создать новый MyObject Я получу ошибку объект ссылается на несохраненный временный экземпляр .Итак, я сделал это:

var newObject = new MyObject()
{
    Child = null
};

repository.Save(newObject);

Это работает для сохранения, но теперь у моего объекта нулевой дочерний элемент, а это не то поведение, которое мне нужно.Хак, который я мог бы использовать, это сбросить дочерний элемент на пустой после создания нового MyObject, но я хочу посмотреть, есть ли лучший способ.

Дочерний элемент должен быть не нулевым в моем объекте, а сохраненкак ноль, если идентификатор дочернего объекта равен 0.

EDIT

Просто тестировал всю стратегию null / reset, и она не работает.последующие запросы nhibernate к любым объектам в моей модели вызывают ошибку временного объекта.

1 Ответ

1 голос
/ 20 июля 2011

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

public class MyObject
{
    public virtual long MyId { get; set; }
    public virtual MyChild Child { get; set; }

    protected /*internal*/ virtual MyChild ChildForPersisting
    {
        get { return (MyChild.Id == 0) ? null : Child; }
        set { if (value != null) Child = value; }
    }

    public MyObject()
    {
        Child = new MyChild();
    }
}

// with internal
References(x => x.ChildForPersisting, "ChildId")

// without internal
References(Reveal.Member<MyChild>("ChildForPersisting"), "ChildId")

другой вариант - реализовать до и после сохранения eventlistener, который обнуляет / сбрасывает дочерний объект, но все же требует больших усилий.

...