Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未处理C#NHibernate映射异常_C#_Nhibernate - Fatal编程技术网

未处理C#NHibernate映射异常

未处理C#NHibernate映射异常,c#,nhibernate,C#,Nhibernate,我是NHibernate的新手,我想创建一个简单的项目来开始使用它。我按照本教程设置了NHibernate文件和配置。与链接不同,我使用Mysql。 我无法运行该程序,因为我在创建配置对象后立即出现映射异常(无法编译映射文档:catsHibernate.Code.Cat.hbm.xml)。这是我的代码,Cat是一个只包含get和set的简单类 App.config <?xml version="1.0"?> <configuration> <configSect

我是NHibernate的新手,我想创建一个简单的项目来开始使用它。我按照本教程设置了NHibernate文件和配置。与链接不同,我使用Mysql。 我无法运行该程序,因为我在创建配置对象后立即出现映射异常(无法编译映射文档:catsHibernate.Code.Cat.hbm.xml)。这是我的代码,Cat是一个只包含get和set的简单类

App.config

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
      <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
      <property name="connection.connection_string">Server=localhost;Database=catsdb;User ID=root;Password=root</property>

      <mapping assembly="catsHibernate"/>
    </session-factory>
  </hibernate-configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

如果您提供完整的异常跟踪,那么找出错误的地方就会容易得多。但可以肯定的是,NHibernate和C#实体命名是区分大小写的。在上面的代码片段中,情况并非如此

C#代码:

显示您的C#实体
Cat
具有标准命名,并且应该如下所示(virtual关键字是必需的)

但映射的目标是小写属性:

<id name="id" column="id" ...
<property name="name" ..
<property name="sex" ...
<property name="weight" ...

你几乎没有做错什么。您的映射也是错误的——属性名称和类不匹配。这是我在sql server上尝试过的示例—您只需将连接设置更改为mysql即可。
因此,编写一个类Cat(属性名应该是大写的,但遵循上面的示例)

这是一张桌子:

CREATE TABLE [dbo].[cats](
[id] [varchar](50) NOT NULL,
[name] [varchar](45) NOT NULL,
[sex] [nchar](10) NOT NULL,
[weight] [decimal](18, 0) NOT NULL
)

现在我们创建一个hbm文件(查看映射属性的大小写名称)、类名和程序集名

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="catsHibernate.code" namespace="catsHibernate.code">  <class name="Cat" table="cats" lazy="false">
<id name="id" column="id" type="String"></id>

<property name="name" type="String">
  <column name="name" length="45" sql-type="varchar" not-null="true"/>
</property>
<property name="sex" column="sex" not-null="true" update="false"/>
<property name="weight" column="weight" not-null="true"/>

这是连接的配置文件(注意程序集名称):


NHibernate.Connection.DriverConnectionProvider
NHibernate.dial.MsSql2012Dialect
NHibernate.Driver.SqlClientDriver
数据源=。\sqlexpress;数据库=StackExchangeExample;综合安全=SSPI;
现在您的程序应该运行了(注意查询中类的名称)

private static void Main(字符串[]args)
{
var cfg=新配置();
Configure();
ISessionFactory sessionFactory=cfg.BuildSessionFactory();
ISession session=sessionFactory.OpenSession();
ITransaction tx1=会话.BeginTransaction();
var c1=新的Cat();
c1.id=“cat1”;
c1.name=“Fluffy”;
c1.sex=“f”;
c1.重量=新的小数点(3.2);
var c2=新的Cat();
c2.id=“cat2”;
c2.name=“手套”;
c2.sex=“m”;
c2.重量=新的小数点(4.3);
尝试
{
session.Save(c1);
会话.保存(c2);
提交();
}
捕获(例外情况除外)
{
tx1.Rollback();
掷骰子;
}
ITransaction tx2=会话.BeginTransaction();
IList cats=session.CreateQuery(“来自Cat”).List();
foreach(猫中的c类)
{
Console.WriteLine(c.name);
}
提交();
session.Close();
}

Hi我在上面添加了堆栈跟踪。我试着像你解释的那样更改属性,但仍然出现映射异常。hbm文件在属性中被设置为嵌入式资源。当您从session.query(“”)创建查询时,名称是区分大小写的类名hi,我现在可以添加两个cat。我的Cat.cs文件看起来像你的,只是我保留了char和float类型。我在xml文件中添加了lazy=“false”以避免使用虚拟类型。我也像你写的那样修改了查询。我觉得奇怪的是,我不得不将每个名称空间和程序集仅更改为catsHibernate,即使我的项目中有文件夹。我应该在名称空间和程序集中编写catsHibernate.Code,但如果这样编写,就会出现映射异常。这里有什么问题?不必-在映射文件中有assemblyname和namespace名称。然后,您可以为每个hbm文件设置不同的命名空间,即…namespace=“catsHibernate.code.MyNamespace”,或者忘记namespace属性并定义完整的类名,包括类映射中的命名空间。在会话查询中,像这样使用“from”+typeof(Cat),这将正确拾取。您的代码无法正确找到类-请将完整示例放在下面。消息上方的错误=未找到持久类catsHibernate.Code.Cat,catsHibernate.Code
Cat c1 = new Cat();
c1.Id = "cat1";
c1.Name = "Fluffy";
c1.Sex = 'f';
c1.Weight = 3.2F;
...
public class Cat
{
    public virtual string Id { get; set; }
    public virtual string Name { get; set; }
    ...
<id name="id" column="id" ...
<property name="name" ..
<property name="sex" ...
<property name="weight" ...
<id name="Id" column="id" type="String" generator="assigned" />
<property name="Name" type="String">
  <column name="name" length="45" sql-type="varchar" not-null="true"/>
</property>
<property name="Sex" column="sex" not-null="true" update="false"/>
<property name="Weight" column="weight" not-null="true"/>
  public class Cat
{
    public string id { get; set; }
    public string name { get; set; }
    public string sex { get; set; }
    public decimal weight { get; set; }
}
CREATE TABLE [dbo].[cats](
[id] [varchar](50) NOT NULL,
[name] [varchar](45) NOT NULL,
[sex] [nchar](10) NOT NULL,
[weight] [decimal](18, 0) NOT NULL
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="catsHibernate.code" namespace="catsHibernate.code">  <class name="Cat" table="cats" lazy="false">
<id name="id" column="id" type="String"></id>

<property name="name" type="String">
  <column name="name" length="45" sql-type="varchar" not-null="true"/>
</property>
<property name="sex" column="sex" not-null="true" update="false"/>
<property name="weight" column="weight" not-null="true"/>
<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=.\sqlexpress;Database=StackExchangeExample;Integrated Security=SSPI;</property>
  <mapping assembly="catsHibernate.code"/>
</session-factory>
 private static void Main(string[] args)
    {
        var cfg = new Configuration();
        cfg.Configure();
        ISessionFactory sessionFactory = cfg.BuildSessionFactory();
        ISession session = sessionFactory.OpenSession();

        ITransaction tx1 = session.BeginTransaction();

        var c1 = new Cat();
        c1.id = "cat1";
        c1.name = "Fluffy";
        c1.sex = "f";
        c1.weight = new Decimal(3.2);

        var c2 = new Cat();
        c2.id = "cat2";
        c2.name = "Mittens";
        c2.sex = "m";
        c2.weight = new Decimal(4.3);

        try
        {
            session.Save(c1);
            session.Save(c2);
            tx1.Commit();
        }
        catch (Exception ex)
        {
            tx1.Rollback();
            throw ex;
        }

        ITransaction tx2 = session.BeginTransaction();

        IList<Cat> cats = session.CreateQuery("FROM Cat").List<Cat>();

        foreach (Cat c in cats)
        {
            Console.WriteLine(c.name);
        }

        tx2.Commit();
        session.Close();
    }