如何在nhibernate中保存?

时间:2011-12-25 00:23:59

标签: nhibernate fluent-nhibernate

我对如何设置我的映射感到困惑,所以事情保存,我不必将引用放到一切。

public class TableAMapping : ClassMap<TableA>
    {
        public TableAMapping()
        {
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize(); ;

            References(x => x.Country).Not.Nullable();
            HasMany(x => x.Bonuses).Cascade.All();
            HasManyToMany(x => x.AvailableFeatures).Cascade.All();
        }
    }

 public class BonusMapping : ClassMap<Bonus>
    {
        public BonusMapping()
        {
            Id(x => x.Id).GeneratedBy.GuidComb();


            Map(x => x.Amount).Not.Nullable().Precision(10).Scale(2);

            References(x => x.BonusType).Not.Nullable();
            References(x => x.TableA).Not.Nullable();

        }
    }

      public class AvailableFeatureMapping : ClassMap<AvailableFeature>
    {
        public AvailableFeatureMapping()
        {
            Id(x => x.Id).GeneratedBy.GuidComb();

            Map(x => x.Name).Not.Nullable().NvarcharWithMaxSize();

            HasManyToMany(x => x.TableAs);

        }
    }

在我的代码中,我做了类似的事情

TableA a = new TableA();
a.Name = "test";
a.Country = session.Load<Country>(1);

foreach(var b in bonuesVm)
{
   Bonus bonus = new Bonus();
   bonus.Amount = b.Amount;
   bonus.BonusType = sesson.Load<BonusType>(b.bonusTypeId);

   a.Bounus.add(bonus);
}

foreach(var avaliable in avaliableVm)
{
   AvaliableFeatures features = new AvaliableFeatures();
   features.Name = avaliable.Name;

   a.AvaliableFeatures.Add(features);
}

session.Save(a);
transaction.Commit();

我剥离了像工作单元这样的东西,我没有显示vm中的内容,因为我认为它不是必需的,因为它们只是属性。这应该会让你知道我在做什么。

映射总是让我困惑。我不确定是否需要使用inversecascade.SaveUpdate()

使用我当前的设置我收到此错误

NHibernate.PropertyValueException was unhandled by user code
  Message=not-null property references a null or transient value Framework.Domain.Bonus.TableA
  Source=NHibernate
  EntityName=.Framework.Domain.Bonus
  PropertyName=TableA

所以我希望我在Bonus对象中引用TableA。有没有这样做?或者无论如何都必须这样做。我会跳过它,因为它在TableA对象中,它可以从中找出它。只是将TableA放入已经在TableA中的Bonus似乎没有意义。

1 个答案:

答案 0 :(得分:0)

您已创建双向链接,但您的对象创建尚未处理。只需将tableA属性分配给奖金,事情应该开始保存......