2013-02-22 68 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