流利的NHibnerate域映射问题

时间:2010-09-10 15:21:42

标签: nhibernate fluent-nhibernate mapping

我的网域:

public class Person
{
    public Person() { }
    public virtual int PersonId { get; set; }
    public virtual string Title { get; set; }
    public virtual string FirstName { get; set; }
    public virtual IList<Address> Addresses { get; set; }
}
public class Address
{
    public Address()
    {}
    public virtual int AddressId { get; set; }
    public virtual Person AddressPerson { get; set; }
    public virtual string BuildingNumber { get; set; }
    public virtual string AddressLine1 { get; set; }
}

我的映射:

public class AddressMap : ClassMap<Address>
{
    public AddressMap()
    {
        Table("Address");
        LazyLoad();
        Id(x => x.AddressId).GeneratedBy.Identity();
        References(x => x.AddressPerson).Column("PersonId").Not.Nullable();
        Map(x => x.BuildingNumber).Length(250).Not.Nullable();
        Map(x => x.AddressLine1).Length(100).Not.Nullable();
    }
}

public class PersonMap : ClassMap<Person>
{
   public PersonMap()
   {
    Table("Person");
    LazyLoad();
    Id(x => x.PersonId).Column("PersonId").GeneratedBy.Identity();
    Map(x => x.Title).Length(6).Nullable();
    Map(x => x.FirstName).Length(100).Not.Nullable();
    HasMany(x => x.Addresses).KeyColumn("PersonId");
    HasMany(x => x.Applications).KeyColumn("PersonId");
   }
}

因此,当我尝试将地址添加到人员列表并保存时,我收到以下错误:

  

对象引用未保存的瞬态   instance - 保存瞬态实例   在冲洗之前。类型:   Rise.Core.Domain.Address,实体:   Rise.Core.Domain.Address

我是NHibernate的新手,我对确切的情况感到有些困惑。我相信我需要创建一个BiDirectional属性或者我应该在保存人员ID会话后自己保存地址.SaveOrUpdate(Person)然后session.SaveOrUpdate(地址)?不确定我到底做错了什么,我喜欢在Person上添加可以延迟加载的地址列表,因为这样可以很容易地编写一些Linq。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我相信自从您尝试保存地址之前保存其所属的人员时,错误就出现了。

我认为你应该

1)保存人员P的空列表&lt; IList&gt; Addreses

2)将此Person P添加为A

的AddressPerson后保存地址A.

3)将地址A添加到&lt; IList&gt;人P的地址

答案 1 :(得分:0)

在stackoverflow上找到关于此的帖子!我只需要添加

.KeyColumn( “PERSONID”)                 。.Inverse()Cascade.SaveUpdate();