【问题标题】:Fluent NHibnerate Domain mapping issueFluent NHibnerate 域映射问题
【发布时间】:2011-04-10 19:07:01
【问题描述】:

我的领域:

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 的新手,我对到底发生了什么有点困惑。我相信我需要创建一个双向属性或者我应该在保存人员 ID session.SaveOrUpdate(Person) 然后保存 session.SaveOrUpdate(Address) 之后自己保存地址?不知道我到底做错了什么,我确实喜欢在 Person 上有可以延迟加载的地址列表,因为它使得编写一些 Linq 变得非常容易。

有什么建议吗?

【问题讨论】:

  • 谷歌'休眠级联瞬态'。有同样的问题,但目前没有时间写详细的答案。

标签: nhibernate fluent-nhibernate mapping


【解决方案1】:

我相信出现错误是因为您在保存地址所属的人之前尝试保存地址。

我认为你应该

1) 用 地址的空列表保存人 P

2) 将此Person P添加为A的AddressPerson后保存地址A

3) 将地址 A 添加到人 P 的 地址

【讨论】:

    【解决方案2】:

    在stackoverflow上找到了一篇关于这个的帖子!我只需要添加

    .KeyColumn("PersonId") .Inverse().Cascade.SaveUpdate();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多