One-Many通过NHibernate通过代码或xml进行Loquacious映射

时间:2013-05-15 01:01:09

标签: c# nhibernate nhibernate-mapping

我希望实现人与车之间的一对多关系,并对人和车都进行CRUD操作。简短的CRUD和关系:

更新

  • person有许多cars
  • 通过人物对象对人和车进行CRUD操作。
  • 删除某人将删除所有他/她的汽车
  • 能够通过人物或汽车对象对某人的汽车进行CRUD操作。

是否可以通过ORM,特别是NHibernate?

如下课程:

public class PersonSet
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<CarSet> Cars { get; set; }
}

public class CarSet
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual PersonSet Person { get; set; }
}

映射如下所示:

  public class PersonSetMap : ClassMapping<PersonSet>
    {
        public PersonSetMap()
        {
            Id(x => x.Id, m=>m.Generator(Generators.Identity));
            Property(x=>x.Name);
            Set(x => x.Cars, c =>
                {
                    //c.Key(k =>
                    //    {
                    //        k.Column("PersonId");
                    //    });
                     c.Cascade(Cascade.All);
                    c.Lazy(CollectionLazy.NoLazy);
                   // c.Inverse(true);
                }
                , r =>
                    {
                        r.OneToMany();
                    }
                );
        }
    }

    public class CarSetMap : ClassMapping<CarSet>
    {
        public CarSetMap()
        {
            Id(x => x.Id, m => m.Generator(Generators.Identity));
            Property(x => x.Name);
            ManyToOne(x => x.Person, m =>
            {
                m.Column("PersonId");
                m.Cascade(Cascade.None);
                m.NotNullable(true);
            });

        }
    }

我遇到的问题是,如果我更新一辆车并尝试将其保存在人物上,它就不会改变。

更新

我想找出,如果有可能,以及上面我的映射错误。任何关于xml版本或Loquacious的想法也将受到赞赏。

PersonId上应该有Car个外键。

1 个答案:

答案 0 :(得分:1)

我不知道这是否能解决您的问题,但在ManyToOne映射中,应在列级应用Unique和NotNullable方法。

ManyToOne(x => x.Person, m =>
{
    m.Column(c =>
    {
        c.Name("PersonId");
        c.NotNullable(true);
    });
    m.Cascade(Cascade.None);
});