2013-02-22 67 views
1

我收到以下例外情況,我很確定它與類別和產品之間的一對多關係有關。怎麼了?Nhibernate:一對多關係導致GenericADOException

Nhibernate.Exceptions.GenericADOException { 「無法執行的批處理命令。[SQL:SQL不適]」}

的InnerException: {「INSERT語句衝突與外鍵約束\ 「FK1F94D86A1B57B09E \」。該衝突發生於數據庫\ 「SimpleNhibernate \」,表\ 「dbo.Category \」,列 'ID'。\ r \ n該語句已終止。「}

Program.cs中

class Program 
{ 
    private static ISessionFactory _sessionFactory; 
    private static Configuration _configuration; 

    static void Main(string[] args) 
    { 

     _configuration = new Configuration(); 
     _configuration.Configure(); 
     _configuration.AddAssembly(typeof(Product).Assembly); 
     _sessionFactory = _configuration.BuildSessionFactory(); 

     var schema = new SchemaExport(_configuration); 
     schema.Drop(true, true); 
     schema.Create(true, true); 

     AddCategory(new Category("Phone")); 
     AddCategory(new Category("Smart Phone")); 

     using (ISession session = NHibernateHelper.OpenSession()) 
     { 
      var categories = session.QueryOver<Category>().List();     
      foreach (var category in categories) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Save(new Product("iPhone", category));  
        transaction.Commit(); 


       } 
      } 
     } 

    } 

    private static void AddCategory(Category product) 
    { 
     using (ISession session = NHibernateHelper.OpenSession()) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.Save(product); 
      transaction.Commit(); 
     } 
    } 
} 

Category.cs

using System; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Iesi.Collections.Generic; 
namespace SimpleNhibernate 
{ 
    public class Category 
    { 
     public virtual Guid Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual ISet<Product> Products { get; set; } 
     public virtual bool Discontinued { get; set; } 

     public Category() { } 

     public Category(string name) 
     { 
      Name = name; 
     } 
    } 
} 

Category.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="SimpleNhibernate" 
        namespace="SimpleNhibernate"> 

    <class name="Category"> 
    <id name="Id"> 
     <generator class="guid" /> 
    </id> 
    <property name="Name" /> 
    <set name="Products" inverse="true" > 
     <key column="Id" /> 
     <one-to-many class="Product"/> 
    </set> 
    <property name="Discontinued" /> 
    </class> 

</hibernate-mapping> 

Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="SimpleNhibernate" 
        namespace="SimpleNhibernate"> 

    <class name="Product"> 
    <id name="Id"> 
     <generator class="guid" /> 
    </id> 
    <property name="Name" /> 
    <many-to-one name="Category" column="CategoryID"></many-to-one> 
    <property name="Discontinued" /> 
    </class> 

</hibernate-mapping> 

Product.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SimpleNhibernate 
{ 
    public class Product 
    { 
     public virtual Guid Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual Category Category { get; set; } 
     public virtual bool Discontinued { get; set; } 

     public Product() { } 
     public Product(string name, Category category) 
     { 
      Name = name; 
      Category = category; 
     } 
    } 
} 

回答

2

負責映射(雙向)的列是產品

CategoryID所以set應具備的關鍵,因爲這

<class name="Category"> 
    ... 
    <set name="Products" inverse="true" > 
     <key column="CategoryID" /> // instead of Id 

與產品製圖中的相同

<many-to-one name="Category" column="CategoryID"></many-to-one> 
+0

非常感謝Radim :) – burnt1ce 2013-02-22 14:55:19

+0

很好,如果這有幫助 – 2013-02-22 15:04:49