Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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出现问题:意外的行计数:0;预期:1_C#_Nhibernate - Fatal编程技术网

C# NHibernate出现问题:意外的行计数:0;预期:1

C# NHibernate出现问题:意外的行计数:0;预期:1,c#,nhibernate,C#,Nhibernate,我有两张桌子: DIC_状态: STATUS_ID 1 2 DIC_状态_字符串: STATUS_ID LANG_ID STATUS_NAME 1 1 Name1 1 2 Name1_1 2 1 Name2 2 2 Name2_2 课程及类别: public class StatusS : AbstractDi

我有两张桌子:

DIC_状态:

STATUS_ID

   1
   2
DIC_状态_字符串:

STATUS_ID   LANG_ID   STATUS_NAME

    1         1         Name1
    1         2         Name1_1
    2         1         Name2
    2         2         Name2_2
课程及类别:

public class StatusS : AbstractDictionaryObject
    {
        public virtual string StatusName { get; set; }
        public virtual Languages Lang { get; set; }
        public virtual Status Status { get; set; }
    }

  public class Status:AbstractDisplayDictionary
    {
        [Browsable(false)]
        public IList<StatusS> DicStatusStrings { get; set; }
        public Status()
        {
            DicStatusStrings = new List<StatusS>();
        }
    }

 public abstract class AbstractDisplayDictionary
    {
        [Browsable(false)]
        public virtual int Id { get; set; }
        [DisplayName("Наименование на русском")]
        public virtual string NameRu { get; set; }
        [DisplayName("Наименование на казахском")]
        public virtual string NameKz { get; set; }
    }
公共类状态:AbstractDictionaryObject
{
公共虚拟字符串StatusName{get;set;}
公共虚拟语言Lang{get;set;}
公共虚拟状态状态{get;set;}
}
公共类状态:AbstractDisplayDictionary
{
[可浏览(错误)]
公共IList DICStatusString{get;set;}
公众地位()
{
DicStatusStrings=新列表();
}
}
公共抽象类AbstractDisplayDictionary
{
[可浏览(错误)]
公共虚拟整数Id{get;set;}
[显示名称(“ааааааааааааааа1072
公共虚拟字符串名称ru{get;set;}
[显示名称(“显示名称”)
公共虚拟字符串NameKz{get;set;}
}
映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="EArchive.Data" namespace="EArchive.Data.Class">  
  <class name="Status" table="DIC_STATUS" lazy="false">
    <id name="Id" column="STATUS_ID">
      <generator class="increment">
      </generator>
    </id>
    <bag name="DicStatusStrings" inverse="true" cascade="all-delete-orphan">
      <key column="STATUS_ID" />
      <one-to-many class="StatusS" />
    </bag>
    <property name="NameRu"
              formula="(SELECT str.STATUS_NAME FROM DIC_STATUS_STRINGS str
              WHERE str.Status_Id = Status_Id and str.Lang_Id=1)"/>

    <property name="NameKz"
              formula="(SELECT str.STATUS_NAME FROM DIC_STATUS_STRINGS str
              WHERE str.Status_Id = Status_Id and str.Lang_Id=2)"/>    
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="EArchive.Data" namespace="EArchive.Data.Class">
<class name="StatusS" table="DIC_STATUS_STRINGS" lazy="false">
  <composite-id>    
    <key-many-to-one name="Status" class="Status">
      <column name="STATUS_ID"/>
    </key-many-to-one>
    <key-property name="LangId" column="LANG_ID"/>
  </composite-id>
  <property name="StatusName" column="STATUS_NAME"/>
  <many-to-one name="Lang" class="Languages" column="LANG_ID" />  
</class>
</hibernate-mapping>

添加记录的方法:

 public void AddRecord(object record)
        {
            StatusDAO statusDao = GetStatusDAO();
            var status = (Status) record;
            IList<StatusS> statusS = status.DicStatusStrings;
            status.DicStatusStrings = null;
            status = statusDao.Save(status);

            foreach (var s in statusS)
            {
                s.Status = status;
            }
            status.DicStatusStrings = statusS;
            statusDao.Update(status);
        }
public void AddRecord(对象记录)
{
StatusDAO StatusDAO=GetStatusDAO();
var状态=(状态)记录;
IList statusS=status.DicStatusStrings;
status.DicStatusStrings=null;
status=statusDao.Save(状态);
foreach(var s处于状态)
{
s、 状态=状态;
}
status.DicStatusStrings=状态;
statusDao.Update(状态);
}
我只在添加记录时出错,编辑效果很好。谢谢


EDIT:覆盖了Equals和GetHashCode方法。

我对复合键也有同样的问题。它与Equals()和GetHashCode()相关

你必须这么做,否则NHibernate不知道他们之间的区别

查看并获取更多信息


编辑:它实际上与已保存和未保存对象之间的匹配有关。缺少对Equals和GetHashCode的覆盖是导致这种情况的多种原因之一。

我对复合键也有同样的问题。它与Equals()和GetHashCode()相关

你必须这么做,否则NHibernate不知道他们之间的区别

查看并获取更多信息


编辑:它实际上与已保存和未保存对象之间的匹配有关。缺少对Equals和GetHashCode的重写是导致此问题的多种原因之一。

:我这样做了,只是没有写出来。我注意到Status.DicStatusStrings上的reverse=“true”。它使另一方对关系负责,如果您调用状态更新,这可能会阻止它被设置。它建议使用并解释了原因。谢谢链接,但我看到了。如果我更改为本机,则引发以下异常:“无法将值NULL插入列'STATUS_ID',表'EArchive.dbo.DIC_STATUS';列不允许NULL。插入失败。语句已终止。”行中:STATUS=statusDao.Save(STATUS);。我尝试添加未保存的值,但不起作用。您是否具有reverse=“true”属性?如果没有,请添加它。此错误看起来像是在生成状态和ID之前保存了关系的另一端。注意:我这样做了,只是没有写入问题。我注意到Status.DicStatusStrings上的reverse=“true”。它使另一方对关系负责,如果您调用状态更新,这可能会阻止它被设置。它建议使用并解释了原因。谢谢链接,但我看到了。如果我更改为本机,则引发以下异常:“无法将值NULL插入列'STATUS_ID',表'EArchive.dbo.DIC_STATUS';列不允许NULL。插入失败。语句已终止。”行中:STATUS=statusDao.Save(STATUS);。我尝试添加未保存的值,但不起作用。您是否具有reverse=“true”属性?如果没有,请添加它。此错误看起来像是在生成状态和ID之前保存了关系的另一端。可能是DB触发器导致了此错误。请看这里:可能是DB触发器导致了这种情况。请看这里: