流畅的NHibernate有许多映射,其中子表没有主键

时间:2010-07-29 19:04:15

标签: nhibernate fluent-nhibernate persistence

所以我在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; }
}

以下是映射 Address没有定义主键,但是name_id和type使其唯一。您看到的列是表结构。

   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”);

        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();

我可以创建一个没有任何地址的名称,然后返回生成的id。

 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. 在这种情况下,地址是否必须自行保存?
  5. 谢谢, 保罗

1 个答案:

答案 0 :(得分:0)

在黑暗中这是一个镜头,但如何在.Cascade.All的{​​{1}}映射中添加HasMany(x => x.Addresses)或类似内容?

我认为NHibernate需要知道您希望将新地址与新名称一起插入。