@H_404_7@Models:
public class ParentDataClassData { public ParentDataClassData() { TitleSetTitles = new List<ChildDataClass1>(); TitlesSetEvents = new List<ChildDataClass2>(); } public virtual int TitleSetID { get; set; } public virtual string name { get; set; } public virtual IList<ChildDataClass1> TitleSetTitles { get; set; } public virtual IEnumerable<ChildDataClass2> TitlesSetEvents { get; set; } public virtual object IDentityFIEld { get { return TitleSetID; } } }public class ChildDataClass1 { public ChildDataClass1() { TitleSet = new ParentDataClassData(); TitleSetTitleEventMedias = new List<TitleSetTitleEventMediaData>(); } public virtual int TitleSetID { get { return TitleSet.TitleSetID; } } public virtual ParentDataClassData TitleSet { get; set; } public virtual IList<TitleSetTitleEventMediaData> TitleSetTitleEventMedias { get; set; } public virtual object IDentityFIEld { get { return TitleSetTitleID; } } } public class ChildDataClass2 { public virtual ParentDataClassData TitleSet { get; set; } public virtual int TitleSetEventID { get; set; } public virtual object IDentityFIEld { get { return TitleSetEventID; } } }
@H_404_7@MapPings:
public class ParentDataClassMap : ClassMap<ParentDataEntity> { public ParentDataClassMap() { table("TitleSet"); LazyLoad(); ID(x => x.TitleSetID) .Column("TitleSetID") .GeneratedBy.Native() .UnsavedValue(0); HasMany(x => x.TitleSetTitles) .LazyLoad() .Inverse() .Fetch.Subselect() .Cascade.SaveUpdate() .KeyColumn("TitleSetID"); HasMany(x => x.TitlesSetEvents) .LazyLoad() .Inverse() .Cascade.SaveUpdate() .Fetch.Subselect() .KeyColumn("TitleSetID"); } } public class ChildDataClass1Map : ClassMap<ChildDataClass1> { public ChildDataClass1Map() { table("TitleSetTitle"); ID(x => x.TitleSetTitleID) .Column("TitleSetTitleID") .GeneratedBy.Native() .UnsavedValue(0); References(x => x.TitleSet) .Fetch.Join() .Not.Nullable() .Column("TitleSetID") .Cascade.None(); HasMany(x => x.TitleSetTitleEventMedias) .LazyLoad() .Inverse() .Cascade.AllDeleteOrphan() .Fetch.Subselect() .KeyColumn("TitleSetTitleID"); }} public class ChildDataClass2Map : ClassMap<ChildDataClass2> { public ChildDataClass2Map() { table("TitleSetEvent"); ID(x => x.TitleSetEventID) .Column("TitleSetEventID") .GeneratedBy.Native() .UnsavedValue(0); References(x => x.TitleSet) .Column("TitleSetID") .Not.Update() .Not.Insert() .Cascade.None(); Map(x => x.LengthSec).Not.Nullable(); Map(x => x.EventID).Not.Nullable(); HasMany(x => x.TitleSetDefaultEventMedia) .LazyLoad() .Inverse() .Cascade.None() .Fetch.Join() .KeyColumn("TitleSetEventID"); HasMany(x => x.TitleSetTitleEventMedias) .LazyLoad() .Inverse() .Cascade.None() .Fetch.Join() .KeyColumn("TitleSetEventID"); } }
@H_404_7@Test:
[Test] public voID CanAddNewTitleSet() { var TitleSet = new TitleSetDataEntity { name = "Somename",ProgramServiceID = 1,CreatedBy = "someuser",CreatedDate = DateTime.Now,ModifIEdBy = "someuser",ModifIEdDate = DateTime.Now,TitleSetTitles = new List<TitleSetTitleData> { new TitleSetTitleData { IsIncluded = true,IsPremIEre = true,TitleTypeCode = "somecode",} },TitlesSetEvents = new List<TitleSetEventData>() }; Session.SaveOrUpdate(TitleSet); }@H_404_7@并获得例外: @H_404_7@
@H_404_7@NHibernate.AdoNet.AbstractBatcher: ERROR@H_404_7@附: @H_404_7@>我使用逆向双向映射
NHibernate.AdoNet.AbstractBatcher [(null)] – Could not execute query:
INSERT INTO TitleSetTitle ([TitleID],…,TitleSetID) VALUES (@p0,
@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8); select ScopE_IDENTITY()
System.Data.sqlClIEnt.sqlException (0x80131904): Cannot insert the
value NulL into column ‘TitleSetID’,table ‘TitleSetTitle’; column
does not allow nulls. INSERT fails. The statement has been terminated.
>无论如何逆不遵守这些事情,根据我的理解,它应首先保存ParantClassData以确保Child类获得正确的ID.
>不确定,我错过了什么 @H_404_7@任何有关上述问题的帮助将受到热烈的赞赏! @H_404_7@更新
添加了更多信息来解释问题,而不是冗长的代码,我只是想知道无论如何TitleSetID Readonly属性相关的问题.解决方法@H_502_56@ 实际上这个问题隐藏在这个映射中: @H_404_7@ @H_404_7@
HasMany(x => x.TitleSetTitles) ... .Inverse();@H_404_7@这个映射正在指导NHibernate: @H_404_7@
@H_404_7@The chlild will care about this relation.@H_404_7@但这意味着,那个孩子必须知道它的父母.在此代码中不是这样的: @H_404_7@
var TitleSet = new TitleSetDataEntity{ name = "Somename",... TitleSetTitles = new List<TitleSetTitleData> { new TitleSetTitleData... },};session.Save(TitleSet);@H_404_7@在此代码中,由新TitleSetTitleData创建的子实例缺少父引用!这就是问题所在 @H_404_7@注 – 我猜属性TitleSetTitles属于IList< ChildDataClass1>类型. TitleSetTitles但在代码中我们使用新的List< TitleSetTitleData> ……我猜这是一个错字 @H_404_7@正确的语法是: @H_404_7@
var TitleSet = new TitleSetDataEntity{ name = "Somename",... TitleSetTitles = new List<TitleSetTitleData>();};var child = new TitleSetTitleData{ ... ParentDataClassData = TitleSet,};TitleSet.TitleSetTitles.Add(child);session.Save(TitleSet);@H_404_7@而现在,NHibernate将拥有足够的信息. Parent在列表中添加了一个Child,Child知道Parent和.Inverse()映射将起作用,因为Parent的ID不再为null 总结
以上是内存溢出为你收集整理的c# – 无法将值NULL插入列,表;列不允许空值. INSERT失败全部内容,希望文章能够帮你解决c# – 无法将值NULL插入列,表;列不允许空值. INSERT失败所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)