Итак, я пару недель в NHibernate, так что, пожалуйста, потерпите меня.Я работаю над устаревшей базой данных со множеством странных проблем.
У меня есть имя объекта
public class Name {
public Name()
{
Addresses = new List<Address>();
}
public virtual string Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual IList<NameAddress> Addresses { get; set; }
}
У него есть дочерние элементы адреса
public class Address
{
public virtual string NameId { get; set; }
public virtual string Line1 { get; set; }
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string Zipcode { get; set; }
public virtual string Type { get; set; }
public virtual bool IsPreferrred { get; set; }
}
ВотДля отображения адресов не определен первичный ключ, но это name_id и тип, которые делают его уникальным.Столбцы, которые вы видите, являются структурой таблицы.
Table("ADDRESS");
CompositeId()
.KeyProperty(x => x.NameId, "NAME_ID")
.KeyProperty(x => x.Type, "ADDRESS_TYPE");
Map(x => x.IsPreferred)
.Column("PREF");
Map(x => x.Line1)
.Column("ADDRESS1");
Map(x => x.Line2)
.Column("ADDRESS2");
Map(x => x.City)
.Column("CITY");
Map(x => x.State)
.Column("STATE");
Name Table ("NAME");
Id(x => x.Id)
.GeneratedBy.Custom<XXIdentifierGenerator>(p => p.AddParam("prefix", "NAME"))
.Column("NAME_ID");
Map(x => x.Prefix)
.Column("NAME_PRE");
Map(x => x.FirstName)
.Column("NAME_FIRST");
HasMany(x => x.Addresses)
.KeyColumn("NAME_ID")
.Table("ADDRESS")
.LazyLoad();
Я могу создать имя без каких-либо адресов и вернуть сгенерированный идентификатор.
repository.Save(name); // only calls session.Save and does a commit
Address address = new NameAddress {IsPreferred = true, Type= "Home", Line1 = "123 Main St",
City = "Anytown", State = "CT", Zipcode="06512" };
name.Addresses.Add(address);
repository.SaveOrUpdate(name);
Когда я пытаюсь сохранить адрес, я получаю исключение
{"Unexpected row count: 0; expected: 1"}
Я не уверен, что
- Мое отображение неверно
- Я не понимаю, как подключить, имеет много
- Я не могу сделать это без первичного ключа
- В этом случае адреса должны быть сохранены самостоятельно?
Спасибо, Пол