2009-09-27 120 views
0

我做了一个简单的示例应用程序来测试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()运行异常,异常是对象引用一个未保存的瞬态的实例 - 冲洗之前保存的瞬态的实例。

那么,任何人都可以帮我弄清楚有什么问题吗?

回答

2

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

你有两个选择,其中#2可能是你的情况首选:

1)session.Save(detail)您刷新会议

2)之前配置您的Details收集级联

有许多在使用自动映射功能时配置级联的方式 - 我通常更喜欢使用[Cascade]属性“污染”我的域模型,然后创建一个简单的实现IHasManyConventionIReferenceConvention,检查是否存在的属性并相应地设置级联选项。

+0

我可以在FluentNHibernate程序集中找到Cascade属性,是否应该使用此属性来修饰我的类属性? 如果没有太大的麻烦,如果你可以给我一个例子,这将是很好的。谢谢 – Marcus 2009-09-27 16:10:56

+0

你知道吗,我刚刚写了一篇关于这个东西的文章:http://mookid.dk/oncode/archives/643 - 实际上,我不知道FNH中有一个CascadeAttribute,我正在说关于是我自己的。我不知道FNH中的人做了什么。 – mookid8000 2009-09-27 16:22:33

+0

对不起,没有看到那里的问号:)好吧,你现在可能已经知道了:它是自制的 – mookid8000 2009-09-27 16:25:40

相关问题