Свободный NHibernate имеет много отображений, где дочерняя таблица не имеет первичного ключа - PullRequest
1 голос
/ 29 июля 2010

Итак, я пару недель в 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"}

Я не уверен, что

  1. Мое отображение неверно
  2. Я не понимаю, как подключить, имеет много
  3. Я не могу сделать это без первичного ключа
  4. В этом случае адреса должны быть сохранены самостоятельно?

Спасибо, Пол

1 Ответ

0 голосов
/ 29 июля 2010

Это немного в темноте, но как насчет добавления .Cascade.All или аналогичного в HasMany(x => x.Addresses) для Name?

Я полагаю, что NHibernate должен знать, что вы хотите, чтобы новые адреса были добавлены вместе с новым именем.

...