c# – 无法将值NULL插入列,表;列不允许空值. INSERT失败

c# – 无法将值NULL插入列,表;列不允许空值. INSERT失败,第1张

概述我在SO上发现了许多类似的问题,我尝试过所说的解决方案,但没有一个对我有用,有人能告诉我下面的代码有什么问题,需要做些什么修正才能使它可行: Models: public class ParentDataClassData { public ParentDataClassData() { TitleSetTitles = new Li 我在SO上发现了许多类似的问题,我尝试过所说的解决方案,但没有一个对我有用,有人能告诉我下面的代码有什么问题,需要做些什么修正才能使它可行: @H_404_7@

@H_404_7@

@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@

@[email protected]: ERROR
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.

@H_404_7@附:

@H_404_7@>我使用逆向双向映射
>无论如何逆不遵守这些事情,根据我的理解,它应首先保存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失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1230766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存