1

这个确切的标题可以在 google 或 stackflow.com 上找到很多次,但我得到这个错误的原因就像它们都没有:我在单元测试代码中没有问题,但应用程序中完全相同的代码导致了这个问题. 我希望这是因为映射问题。

这是我的映射:

     <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="My.Domain" namespace="My.Domain">
      <class name="My.Domain.ReportFormFlag, My.Domain" table="ReportFormFlag" schema="Core">
        <id name="FlagID">
          <column name="FlagID" sql-type="uniqueidentifier" not-null="true"/>
          <generator class="guid"/>
        </id>
        <property name="ReportInstanceID" column="ReportInstanceID" type="int" not-null="true"/>
        <property name="FormID" column="FormID" type="int" not-null="true"/>
        <property name="SiteOrProjectID" column="SiteOrProjectID" type="int" not-null="true"/>
        <property name="IsFlagged" column="IsFlagged" type="int" not-null="true"/>
        <property name="FlagComment" column="FlagComment" type="string" not-null="false"/>
      </class>
    </hibernate-mapping>

and here is my class

namespace My.Domain
{
    [Serializable]
    public class ReportFormFlag
    {
        public virtual Guid FlagID { get; set; }    
        public virtual int ReportInstanceID { get; set; }
        public virtual int FormID { get; set; }
        public virtual int SiteOrProjectID { get; set; }
        public virtual int IsFlagged { get; set; }
        public virtual string FlagComment { get; set; }
    }
}

我用来插入新记录的代码:

 var reportFormFlag = new ReportFormFlag
            {
                ReportInstanceID = 3554,
                FormID = 25,
                SiteOrProjectID = 0,
                FlagComment = "test",
                IsFlagged = 1
            };
_provider.Save(reportFormFlag);

在 NUnit 测试中,它按预期工作,但在应用程序中,save() 导致“此 SqlParameterCollection 的索引 N 无效,Count=N”异常。

我正在使用 NH 3.0、C#3.5、SQL Server 2008 R2。

非常感谢任何见解!

4

2 回答 2

3

通常这意味着您有一个字段在实体中映射了两次。

于 2012-07-19T03:30:33.353 回答
2

感谢您的提醒,@ps2goat。今天才看到你的评论!

这是映射问题,但不是因为数据库字段被映射两次。我以前遇到过这个问题,但忘记了。该问题与如何映射某些类型(例如整数和日期时间)的可空数据字段有关。如果 db 中的 int 或 datetiem 字段可以为空,则相应的属性也必须设置为可以为空。在 C# 中,这是通过添加“?”来实现的。到属性的类型。希望这可以帮助某人。

于 2016-03-05T16:33:43.933 回答