C# NHibernate出现问题:意外的行计数:0;预期:1
我有两张桌子: DIC_状态: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
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触发器导致了这种情况。请看这里: