【发布时间】:2019-02-22 04:08:17
【问题描述】:
我正在尝试使用部分父复合 ID 引用一些子实体。 我有一个表格定义如下:
Programs
Events
ProgramEvents
类文件:
public class Program
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<ProgramEvent> StartEvents { get; set; }
public virtual IList<ProgramEvent> EndEvents { get; set; }
}
public class ProgramEvent
{
public virtual Event Event { get; set; }
public virtual bool Repeatable { get; set; }
public virtual int EventOrder { get; set; }
public virtual int EventSection { get; set; }
public virtual Program Program { get; set; }
public override bool Equals(object obj)
{
return Equals(obj as ProgramEvent);
}
public override int GetHashCode()
{
unchecked
{
int hash = GetType().GetHashCode();
hash = (hash * 31) ^ EventSection.GetHashCode();
hash = (hash * 31) ^ EventOrder.GetHashCode();
hash = (hash * 31) ^ Event.Id.GetHashCode();
hash = (hash * 31) ^ Program.Id.GetHashCode();
return hash;
}
}
程序类的映射包含这样的参考:
<list name="StartEvents" table="ProgramEvents" lazy="false" where="EVENT_SECTION = 1" cascade="all-delete-orphan" inverse="true">
<key column="PROGRAM_ID" />
<index column="EVENT_ORDER" />
<one-to-many class="ProgramEvent"/>
</list>
程序事件类的映射:
<class name="ProgramEvent" table="ProgramEvents">
<composite-id>
<key-many-to-one class="Program" lazy="false" name="Program" column="PROGRAM_ID" />
<key-many-to-one class="Event" lazy="false" name="Event" column="EVENT_ID" />
<key-property name="EventOrder" column="EVENT_ORDER" />
<key-property name="EventSection" column="EVENT_SECTION" />
</composite-id>
<property name="Repeatable" column="REPEATABLE"/>
</class>
当我尝试使用对事件表的新引用来保存程序时,我收到了这样的错误:
SqlException:无法将值 NULL 插入列“PROGRAM_ID”, 表“节目事件”;列不允许空值。 插入失败。声明已终止。
我打开 sql profiler 得到了这样的 sql:
exec sp_executesql N'INSERT INTO ProgramEvents (REPEATABLE, PROGRAM_ID、EVENT_ID、EVENT_ORDER、EVENT_SECTION)值(@p0、@p1、 @p2,@p3,@p4)',N'@p0 位,@p1 int,@p2 int,@p3 int,@p4 int',@p0=1,@p1=NULL,@p2=NULL,@p3=0,@p4=0
NHibernate 确实尝试插入空值。为什么会这样?
UPD 我尝试像这样更新程序:
var program = ProgramDao.Current.GetById(1);
var newEvent = EventDao.Current.GetById(4);
var programEvent = new ProgramEvent { Event = newEvent, Repeatable = true };
program.StartEvents.Add(programEvent);
using (var session = SessionFactory.Current.OpenSession())
{
session.Evict(program);
session.Update(program);
session.Flush();
}
【问题讨论】:
-
没用。
标签: c# nhibernate