C# 尽管正在打印查询,但NHibernate未保存记录

C# 尽管正在打印查询,但NHibernate未保存记录,c#,nhibernate,save,C#,Nhibernate,Save,我是NHibernate的新手(我用Java实现了Hibernate,没有任何问题),面临着一个奇怪的问题 我正在使用Visual Studio 2012并创建了一个控制台项目。我创建了一个“基于服务的数据库”(我附上了一个屏幕截图) 这是我的档案: hibernate.cfg.xml(始终复制,嵌入资源),并确保它存在于调试文件夹中 <?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="

我是NHibernate的新手(我用Java实现了Hibernate,没有任何问题),面临着一个奇怪的问题

我正在使用Visual Studio 2012并创建了一个控制台项目。我创建了一个“基于服务的数据库”(我附上了一个屏幕截图)

这是我的档案:

hibernate.cfg.xml(始终复制,嵌入资源),并确保它存在于调试文件夹中

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
 <session-factory>    
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>    
      <property name="connection.connection_string">
        data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\NHibernateTest.mdf;
      </property>
      <property name="show_sql">true</property>

  <mapping assembly="NHibernateConsoleProject"/>
 </session-factory>
</hibernate-configuration> 
NHibernateHelper.cs

namespace NHibernateConsoleProject
{
public class Contact
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}
} 
using NHibernate;
using NHibernate.Cfg;
using System.Reflection;

namespace NHibernateConsoleProject
{
public sealed class NHibernateHelper
{
    private static ISessionFactory SessionFactory;

    private static void OpenSession()
    {
        Configuration configuration = new Configuration().Configure();
        SessionFactory = configuration.BuildSessionFactory();
    }

    public static ISession GetCurrentSession()
    {
        if (SessionFactory == null)
            NHibernateHelper.OpenSession();

        return SessionFactory.OpenSession();
    }

    public static void CloseSessionFactory()
    {
        if (SessionFactory != null)
            SessionFactory.Close();
    }
}    
}
using NHibernate;
using System;
using System.Collections.Generic;

namespace NHibernateConsoleProject
{
class ReadContacts
{
    static void Main()
    {
        ISession session = NHibernateHelper.GetCurrentSession();

        IList<Contact> contacts = session.CreateCriteria(typeof(Contact)).List<Contact>();

        foreach (Contact contact in contacts)
        {
            Console.WriteLine(contact.FirstName + " , " + contact.LastName);
        }
    }
}
}
和我的节目

using NHibernate;
using System;

namespace NHibernateConsoleProject
{
class Program
{
    static void Main(string[] args)
    {
        Contact contact = new Contact();

        contact.FirstName = "Ashutosh";
        contact.LastName = "Pandey";
        ISession session = NHibernateHelper.GetCurrentSession();
        ITransaction transaction = session.BeginTransaction();

        session.Save(contact);
        session.Flush();

        transaction.Commit();

        session.Close();

        Console.WriteLine("Saved...");
    }
}
}
当我运行代码时,我得到以下输出:

NHibernate: INSERT INTO Contact (FirstName, LastName) VALUES (@p0, @p1); select SCOPE_IDENTITY();@p0 = 'Ashutosh' [Type: String (4000)], @p1 = 'Pandey' [Type: String (4000)]
Saved...
Press any key to continue . . .
我手动执行查询来插入记录,它被插入。我用下面的程序读取了插入的记录,它工作了,插入不工作了

ReadContact.cs

namespace NHibernateConsoleProject
{
public class Contact
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}
} 
using NHibernate;
using NHibernate.Cfg;
using System.Reflection;

namespace NHibernateConsoleProject
{
public sealed class NHibernateHelper
{
    private static ISessionFactory SessionFactory;

    private static void OpenSession()
    {
        Configuration configuration = new Configuration().Configure();
        SessionFactory = configuration.BuildSessionFactory();
    }

    public static ISession GetCurrentSession()
    {
        if (SessionFactory == null)
            NHibernateHelper.OpenSession();

        return SessionFactory.OpenSession();
    }

    public static void CloseSessionFactory()
    {
        if (SessionFactory != null)
            SessionFactory.Close();
    }
}    
}
using NHibernate;
using System;
using System.Collections.Generic;

namespace NHibernateConsoleProject
{
class ReadContacts
{
    static void Main()
    {
        ISession session = NHibernateHelper.GetCurrentSession();

        IList<Contact> contacts = session.CreateCriteria(typeof(Contact)).List<Contact>();

        foreach (Contact contact in contacts)
        {
            Console.WriteLine(contact.FirstName + " , " + contact.LastName);
        }
    }
}
}
使用NHibernate;
使用制度;
使用System.Collections.Generic;
名称空间NHibernateConsole项目
{
类读取联系人
{
静态void Main()
{
ISession session=NHibernateHelper.GetCurrentSession();
IList contacts=session.CreateCriteria(typeof(Contact)).List();
foreach(触点中的触点)
{
Console.WriteLine(contact.FirstName+“,”+contact.LastName);
}
}
}
}

删除
会话.Flush()


使用事务时,提交会刷新所有事务。

您确定在服务器资源管理器中查找的数据库与插入的数据库相同吗?您的代码没有问题,应该插入记录,因为没有错误。这意味着您正在使用另一个数据库。查看
bin\Debug
文件夹(或任何输出文件夹),确保您正在服务器资源管理器中检查该数据库

编辑: 谢谢你的源代码。我在我的机器上检查过,一切正常(我看到插入的记录)。必须插入记录,因为您没有得到任何异常,并且在保存实体后获得了一个新id


问题可能是项目中的NHibernateTest.mdf文件总是复制到输出目录。请尝试将属性
复制到输出目录
更改为
不复制
,并查看是否有帮助(右键单击解决方案中的文件->
属性
->
复制到输出目录
)。而且,正如我前面所说的,请确保Visual Studio中的
数据连接中的数据库指向
bin\Debug
文件夹中的数据库。g

谢谢大家的努力,我用代码中的这一行解决了这个问题:

AppDomain.CurrentDomain.SetData(“DataDirectory”,Directory.GetCurrentDirectory())

对于我的数据库,我使用(数据库的属性):

构建操作:内容


复制到输出:始终复制(不起作用。我创建了一个基于本地服务的数据库(没有SQL Server Management Studio)。该数据库列在解决方案资源管理器中。我双击该数据库并检查数据。bin文件夹中还有另一个数据库。我正在考虑这两个副本是否是罪魁祸首。虽然解决方案资源管理器中列出的数据库已将Copy to output目录设置为Copy alwaysChange,但在取消配置时将attachdbfilename设置为fixed path,然后您确定使用了相同的db文件Hi Frank,我检查了这两个数据库,甚至以管理员身份启动了Visual Studio 2012,但错误是相同的:(我在这个url上附加了该项目(正如我的防病毒软件所说的,它是无病毒的)[]如果您有一些宝贵的时间,请告诉我可能的错误。mdf文件是解决方案的一部分,每次生成时,它都会覆盖调试或发布文件夹中的版本。请将属性从“始终复制”设置为“更新时复制”(请参阅)。我还注意到,在hmb中,您的id生成有一种不同的书写方式。它应该是“嗨,Alexander,我检查了这两个数据库,甚至以管理员身份启动了Visual Studio 2012,但错误是相同的:(我在这个url上附加了项目(正如我的防病毒软件所说,它是无病毒的)[tbf.me/a/BxT5xZ]如果你有宝贵的时间,请告诉我有什么问题