nhibernate не сохраняет идентификатор внешнего ключа

У меня есть простая модель, которую я пытаюсь сохранить с помощью Fluent -nhibernate:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Address> Addresses { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public int PersonId { get; set; }
    public string Street { get; set; }        
}

Некоторые примеры данных:

var person = new Person() {Name = "Name1", Addresses = new[]
    {
        new Address { Street = "Street1"},
        new Address { Street = "Street2"}
    }};

Когда я вызываю session.SaveOrUpdate(person), оба объекта сохраняются, но внешний ключ не сохраняется в таблице адресов:

enter image description here

Что я делаю неправильно? Мои переопределения сопоставлений следующие::

public class PersonOverrides : IAutoMappingOverride<Person>
{
    public void Override(AutoMapping<Person> mapping)
    {
        mapping.Id(x => x.Id);
        mapping.HasMany(x => x.Addresses).KeyColumn("PersonId").Cascade.All();            
    }
}

public class AddressOverrides : IAutoMappingOverride<Address>
{
    public void Override(AutoMapping<Address> mapping)
    {
        mapping.Id(x => x.Id);               
    }
}

Обратите внимание, , я планирую использовать List<Address>в других объектах, и я не хочу добавлять свойство Address.Person.

ОБНОВЛЕНИЕ 1

Я заставил это «работать», заменив Address.PersonIdна Address.Person, но я не хочу, чтобы Addressимел свойство Person, так как я не хочу, чтобы этот циркуляр ссылка. Кроме того, при вставке вышеуказанного объекта при просмотре журналов nHibernate появляется 1 )вставить персону 2 )вставить адрес с NULL PersonId 3 )обновить адрес с PersonId (при очистке )когда действительно шаги 2 и 3 можно сделать одновременно? Это вызывает другую проблему, если значение NULL запрещено для Address.PersonId

ОБНОВЛЕНИЕ 2 Удаление свойства Address.PersonIdприводит к тому, что PersonIdстановится заполненным в базе данных. nHibernate не нравится, когда я предоставляю свой собственный PersonId, который явно используется для вставки/извлечения записей. Так что на самом деле я хочу пометить мой Address.PersonIdфлагом «Эй, это не отдельное поле, это поле, которое вы собираетесь использовать в дальнейшем, пожалуйста, отнеситесь к нему по-особому». Кроме того, как указано выше, nHibernate, по-видимому, вставляет NULL в столбец PersonId (, когда Saveвыполняет ), а ЗАТЕМ обновляет его впоследствии (, когда Flushвыполняет )??

5
задан wal 29 April 2012 в 08:25
поделиться