C# NHibernate错误消息:对象引用未保存的临时实例-在刷新之前保存临时实例

C# NHibernate错误消息:对象引用未保存的临时实例-在刷新之前保存临时实例,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我正在使用nHibernate并尝试添加一些主细节数据。数据库图附在这里。 以下是添加类别和两种产品的代码: //Category namespace Sample.CustomerService.Domain { public class Category { public Category() { Products = new List<Product>(); } public virtual i

我正在使用nHibernate并尝试添加一些主细节数据。数据库图附在这里。

以下是添加类别和两种产品的代码:

//Category
namespace Sample.CustomerService.Domain
{

    public class Category {
        public Category() {
            Products = new List<Product>();
        }
        public virtual int CategoryID { get; set; }
        public virtual IList<Product> Products { get; set; }
        public virtual string Name { get; set; }
        public virtual string Unit { get; set; }

        public virtual void AddProduct(Product product)
        {
            Products.Add(product);
        }
    }
}

//CategoryMap
namespace Sample.CustomerService.Domain
{

    public class CategoryMap : ClassMap<Category> {

        public CategoryMap() {
            Table("Category");
            LazyLoad();
            Id(x => x.CategoryID).GeneratedBy.Identity().Column("CategoryID");
            Map(x => x.Name).Column("Name").Not.Nullable().Length(50);
            Map(x => x.Unit).Column("Unit").Not.Nullable().Length(3);
            HasMany(x => x.Products).KeyColumn("CategoryID");
        }
    }
}

//--------------------------------------------------------------------------------------------
//Product
namespace Sample.CustomerService.Domain
{

    public class Product {
        public Product() {
        }
        public virtual int ProductID { get; set; }
        public virtual Category Category { get; set; }
        public virtual string Name { get; set; }
        public virtual decimal UnitPrice { get; set; }

    }
}

//ProductMap
namespace Sample.CustomerService.Domain {


    public class ProductMap : ClassMap<Product> {

        public ProductMap() {
            Table("Product");
            LazyLoad();
            Id(x => x.ProductID).GeneratedBy.Identity().Column("ProductID");
            References(x => x.Category).Column("CategoryID");
            Map(x => x.Name).Column("Name").Not.Nullable().Length(50);
            Map(x => x.UnitPrice).Column("UnitPrice").Not.Nullable();
        }
    }
}

//----------------------------------------------------------------------------------------------
//Program
namespace WindowsHibernateTest
{
    public partial class TestClass : Form
    {
        public TestClass()
        {
            InitializeComponent();
            CreateNewProduct();
        }

        public void CreateNewProduct()
        {
            try
            {
                var sessionFactory = CreateSessionFactory();
                using (var session = sessionFactory.OpenSession())
                {
                    using (var sqlTrans = session.BeginTransaction())
                    {
                        Category newGold = new Category() { Name = "Gold", Unit = "GRM" };

                        Product ngOrn = new Product() { Name = "Bangles", UnitPrice = 1000.10M };
                        Product ogOrn = new Product() { Name = "Rings", UnitPrice = 2000.10M };

                        AddProductsToCategory(newGold, ngOrn, ogOrn);

                        session.SaveOrUpdate(newGold);

                        sqlTrans.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure().Database(MsSqlConfiguration.MsSql2005.
                ConnectionString("Data Source=MyDB; Initial Catalog=NHibernateTest; Trusted_Connection=true;")).Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>()).BuildSessionFactory();

        }

        public static void AddProductsToCategory(Category category, params Product[] products)
        {
            foreach (var product in products)
            {
                category.AddProduct(product);
            }
        }

    }
}
//类别
命名空间Sample.CustomerService.Domain
{
公共类类别{
公共类别(){
产品=新列表();
}
公共虚拟int类别ID{get;set;}
公共虚拟IList产品{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串单元{get;set;}
公共虚拟产品(产品产品)
{
产品。添加(产品);
}
}
}
//类别映射
命名空间Sample.CustomerService.Domain
{
公共类类别映射:类映射{
公共类别映射(){
表(“类别”);
懒散的负荷();
Id(x=>x.CategoryID).GeneratedBy.Identity()列(“CategoryID”);
Map(x=>x.Name).Column(“Name”).Not.Nullable().Length(50);
Map(x=>x.Unit).Column(“Unit”).Not.Nullable().Length(3);
有许多(x=>x.Products);
}
}
}
//--------------------------------------------------------------------------------------------
//产品
命名空间Sample.CustomerService.Domain
{
公共类产品{
公共产品(){
}
公共虚拟int ProductID{get;set;}
公共虚拟类别{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟十进制单价{get;set;}
}
}
//产品地图
命名空间Sample.CustomerService.Domain{
公共类ProductMap:ClassMap{
公共产品地图(){
表(“产品”);
懒散的负荷();
Id(x=>x.ProductID).GeneratedBy.Identity()列(“ProductID”);
参考文献(x=>x.Category)。列(“CategoryID”);
Map(x=>x.Name).Column(“Name”).Not.Nullable().Length(50);
Map(x=>x.UnitPrice).Column(“UnitPrice”).Not.Nullable();
}
}
}
//----------------------------------------------------------------------------------------------
//节目
命名空间窗口休眠测试
{
公共部分类TestClass:表单
{
公共测试类()
{
初始化组件();
CreateNewProduct();
}
public void CreateNewProduct()
{
尝试
{
var sessionFactory=CreateSessionFactory();
使用(var session=sessionFactory.OpenSession())
{
使用(var sqlTrans=session.BeginTransaction())
{
类别newGold=newcategory(){Name=“Gold”,Unit=“GRM”};
产品ngOrn=新产品(){Name=“Bangles”,单价=1000.10M};
Product ogOrn=new Product(){Name=“Rings”,单价=2000.10M};
AddProductsToCategory(新黄金、恩戈尔、奥戈尔);
SaveOrUpdate(newGold);
提交();
}
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私有静态ISessionFactory CreateSessionFactory()
{
流畅地返回.Configure().Database(MsSqlConfiguration.MsSql2005)。
ConnectionString(“数据源=MyDB;初始目录=NHibernateTest;可信连接=true;”)).Mappings(m=>m.FluentMappings.AddFromAssemblyOf()).BuildSessionFactory();
}
公共静态无效AddProductsToCategory(类别类别,参数产品[]产品)
{
foreach(产品中的var产品)
{
类别.添加产品(产品);
}
}
}
}
在行
sqlTrans.Commit()
中,我得到以下错误:

对象引用未保存的临时实例-保存临时实例 冲洗前的实例。类型:Sample.CustomerService.Domain.Product, 实体:Sample.CustomerService.Domain.Product


我在谷歌上搜索了很长一段时间,没有找到令人信服的解决方案。我已尝试,但无法解决此错误。请帮我解决这个错误。提前感谢。

我认为您需要在保存类别之前保存产品,因为您在HasMany上没有级联。 您需要更改add product方法以保持关系

foreach (var product in products)
{
    category.AddProduct(product); 
    product.Category = category;
} 

不知道这是否是您的问题,但您需要更改您在那里获得的add product方法:foreach(产品中的var product){category.AddProduct(product);product.category=category;}product是category的子级。没有类别就不能创建产品。@为什么?您可以在它为空时保存它,无论如何,您需要更改关系,就像我在回答中添加了注释一样。@Nagesh顺便说一句,我认为您需要了解reverse和cascase的作用。这是我的问题,当我了解NH。。。祝你好运请提供一些链接,我可以从中下载有关Hibernate的文档。我的一个朋友发布的教程: