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;
}
}
}
非常感谢Radim :) – burnt1ce 2013-02-22 14:55:19
很好,如果这有帮助 – 2013-02-22 15:04:49