Fluent NHibernate和Automappings的关系问题

时间:2009-09-27 13:15:14

标签: c# fluent-nhibernate

我已经用一个简单的示例应用程序来测试Fluent NHibernate的自动化功能,但是当我保存时我得到了一个例外。

这就是我的例子:

public class Item  {
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
    public virtual IList<Detail> Details { get; set; }
    public Item() {
        Details = new List<Detail>();
    }
}
public class Detail {
    public virtual int Id { get; protected set; }
    public virtual int ItemId { get; set; }
    public virtual string Name { get; set; }
}
class Program {
    static void Main(string[] args) {
        var sessionFactory = CreateSessionFactory();
        using (var session = sessionFactory.OpenSession()) {
            using (var transaction = session.BeginTransaction()) {

                Console.WriteLine("Enter name for new item: ");
                var itemName = Console.ReadLine();
                var page = new Item { Name = itemName };
                Console.WriteLine("Enter name of new detail");
                var detailName = Console.ReadLine();
                var detail = new Detail {Name = detailName };
                page.Details.Add(detail);
                session.SaveOrUpdate(page);
                transaction.Commit();
            }
            using (session.BeginTransaction()) {
            }
            Console.ReadKey();
        }

    }
    private static ISessionFactory CreateSessionFactory() {

        var model = AutoMap.AssemblyOf<Program>();

        var sessionFactory = Fluently.Configure()
          .Database(MsSqlConfiguration.MsSql2008.ConnectionString(connection)
          .Cache(c => c.UseQueryCache()
            .ProviderClass<HashtableCacheProvider>())
            .ShowSql())
          .Mappings(m => m.AutoMappings.Add(model))
          .BuildSessionFactory();

        return sessionFactory;
    }
}

当transaction.Commit()运行时,此代码抛出异常,异常是对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。

那么有人能帮我弄清楚出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

您的detail实例是“瞬态”,这意味着尚未添加到您的NHibernate会话中。

你有两个选择,在你的情况下可能首选#2:

在刷新会话之前

1)session.Save(detail)

2)将您的Details集合配置为级联

使用自动化功能时,有许多方法可以配置级联 - 我通常更喜欢使用[Cascade]属性“污染”我的域模型,然后创建IHasManyConvention和{的简单实现{1}}检查是否存在属性并相应地设置级联选项。