Семантика один на один - PullRequest
0 голосов
/ 06 марта 2012

У меня есть два класса домена следующим образом:

[ActiveRecord]
public class ClassOne : ActiveRecordBase<ClassOne>
{
    [PrimaryKey(PrimaryKeyType.GuidComb)]
    public Guid Id { get; set; }

    [OneToOne(Cascade = CascadeEnum.All)]
    public ClassTwo ClassTwo { get; set; }
}

[ActiveRecord]
public class ClassTwo : ActiveRecordBase<ClassTwo>
{
    [PrimaryKey(PrimaryKeyType.Foreign)]
    public Guid Id { get; set; }

    [OneToOne(Constrained = true)]
    public ClassOne ClassOne { get; set; }
}

Когда у меня есть следующее:

var one = new ClassOne();
var two = new ClassTwo();
one.ClassTwo = two;
one.Save();

Я получаю сообщение об ошибке «Не удалось выполнить сохранение для ClassOne» с «попытка присвоить идентификатор из нулевого свойства« один к одному »: ClassOne».

»

Я бы ожидал Castle ActiveRecord или, возможно, NHibernate, из-за того, что отношение определяется как один к одному, чтобы автоматически назначать two.ClassOne, когда назначается one.ClassTwo. Для этого я реализовал следующее:

    private ClassTwo _classTwo;
    [OneToOne(Cascade = CascadeEnum.All)]
    public ClassTwo ClassTwo
    {
        get { return _classTwo; }
        set
        {
            _classTwo = value;
            if (_classTwo.ClassOne == null)
                _classTwo.ClassOne = this;
        }
    }

Это упущение в структуре или я, возможно, упускаю какой-то вариант использования, который бы противопоказал это поведение?

...