Nhibernate:一对多关系正在导致泛型异常
我得到了以下例外,我很确定这与类别和产品之间的一对多关系有关。怎么了 Nhibernate.Exceptions.GenericADOException {“无法执行批处理命令。[SQL:SQL不可用]”} 内部异常: {“INSERT语句与外键约束“FK1F94D86A1B57B09E”冲突。冲突发生在数据库“SimpleNhibernate\”表“dbo.Category\”列“Id”中。\r\n语句已终止。“” Program.csNhibernate:一对多关系正在导致泛型异常,nhibernate,Nhibernate,我得到了以下例外,我很确定这与类别和产品之间的一对多关系有关。怎么了 Nhibernate.Exceptions.GenericADOException {“无法执行批处理命令。[SQL:SQL不可用]”} 内部异常: {“INSERT语句与外键约束“FK1F94D86A1B57B09E”冲突。冲突发生在数据库“SimpleNhibernate\”表“dbo.Category\”列“Id”中。\r\n语句已终止。“” Program.cs class Program { private
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();
}
}
}
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;
}
}
}
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;
}
}
}
负责映射(两个方向)的列是产品表中的
CategoryID
因此,集合
应该有如下键
<class name="Category">
...
<set name="Products" inverse="true" >
<key column="CategoryID" /> // instead of Id
...
//而不是Id
与产品映射中的相同
<many-to-one name="Category" column="CategoryID"></many-to-one>
<class name="Category">
...
<set name="Products" inverse="true" >
<key column="CategoryID" /> // instead of Id
<many-to-one name="Category" column="CategoryID"></many-to-one>