【发布时间】:2014-06-17 16:01:48
【问题描述】:
我在 SO 上发现了许多类似的问题,我尝试了上述解决方案,但没有一个对我有用,谁能告诉我以下代码有什么问题,需要进行哪些更正才能使其可行:
型号:
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; }
}
}
映射:
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");
}
}
测试:
[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);
}
并得到异常:
NHibernate.AdoNet.AbstractBatcher:错误 NHibernate.AdoNet.AbstractBatcher [(null)] - 无法执行查询: 插入到 TitleSetTitle ([TitleID], ..., TitleSetID) 值 (@p0, @p1、@p2、@p3、@p4、@p5、@p6、@p7、@p8);选择 SCOPE_IDENTITY() System.Data.SqlClient.SqlException (0x80131904):无法插入 值 NULL 到列“TitleSetID”,表“TitleSetTitle”;柱子 不允许空值。插入失败。声明已终止。
附言
- 我在双向映射中使用了逆向
- 无论如何 inverse 不服从这些东西,据我了解,它应该首先保存
ParantClassData以确保Child类获得正确的 id。 - 不确定,我错过了什么
对上述问题的任何帮助将不胜感激!
更新
添加了更多信息来解释该问题,而不是冗长的代码,我只是想知道是否无论如何TitleSetID readonly 属性相关问题。
【问题讨论】:
-
停止尝试将空值放入
TitleSetID? -
将代码缩减为显示错误的最小示例。您正在尝试将 NULL 插入到
TitleSetID中,或者您没有在插入列表中包含TitleSetID。 -
我没有向
TitleSetID提供任何空值,请参阅我的测试,只是尝试插入新集合。 -
查看@DanielKelley 的回答。主要问题在于它的描述而不是它的标题
标签: c# sql nhibernate fluent-nhibernate