C# 尽管正在打印查询,但NHibernate未保存记录
我是NHibernate的新手(我用Java实现了Hibernate,没有任何问题),面临着一个奇怪的问题 我正在使用Visual Studio 2012并创建了一个控制台项目。我创建了一个“基于服务的数据库”(我附上了一个屏幕截图) 这是我的档案: hibernate.cfg.xml(始终复制,嵌入资源),并确保它存在于调试文件夹中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="
<?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]如果你有宝贵的时间,请告诉我有什么问题