我已经用一个简单的示例应用程序来测试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()运行时,此代码抛出异常,异常是对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。
那么有人能帮我弄清楚出了什么问题吗?
答案 0 :(得分:2)
您的detail
实例是“瞬态”,这意味着尚未添加到您的NHibernate会话中。
你有两个选择,在你的情况下可能首选#2:
在刷新会话之前 1)session.Save(detail)
2)将您的Details
集合配置为级联
使用自动化功能时,有许多方法可以配置级联 - 我通常更喜欢使用[Cascade]
属性“污染”我的域模型,然后创建IHasManyConvention
和{的简单实现{1}}检查是否存在属性并相应地设置级联选项。