所以我在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"}
我不确定是否
谢谢, 保罗
答案 0 :(得分:0)
在黑暗中这是一个镜头,但如何在.Cascade.All
的{{1}}映射中添加HasMany(x => x.Addresses)
或类似内容?
我认为NHibernate需要知道您希望将新地址与新名称一起插入。