【发布时间】:2010-07-30 03:07:54
【问题描述】:
所以我已经使用 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");
名称 表(“名称”);
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"}
我不确定
- 我的映射错误
- 我不明白如何连接一个有很多
- 没有主键我无法做到这一点
- 在这种情况下,地址是否必须自己保存?
谢谢, 保罗
【问题讨论】:
标签: nhibernate fluent-nhibernate persistence