У меня есть простая модель, которую я пытаюсь сохранить с помощью 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)
, оба объекта сохраняются, но внешний ключ не сохраняется в таблице адресов:
Что я делаю неправильно? Мои переопределения сопоставлений следующие::
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
выполняет )??