1

使用流畅的 nhibernate 映射得到以下错误

“无法将值 NULL 插入到列 'TitleId'、表 'database.dbo.Issues';列不允许空值。更新失败。语句已终止。”

我有以下映射

标题表具有以下列Title.IdTitle.TitleCrossPromotionId

CrossPromoLinkups表具有PromoTitleIdTitleCrossPromoId,它们按该顺序链接到标题表

(如果第二列实际上与 Id 列相同,我知道这是糟糕的设计,但这是一个遗留系统,因此更改数据库会很痛苦)

这有效地使CrossPromoLinkups表成为为 Titles 表创建多对多的关系表(其中包含几个额外的数据列)

标题映射

        HasMany<CrossPromotionLinkUp>(c => c.PromotionLinkUp)
            .Table("dbo.CrossPromoLinkups")
            .Cascade.SaveUpdate()
            .Inverse()
            .LazyLoad()
            .KeyColumn("TitleCrossPromoId") //need to set the Id its mapped to (its not Title.Id its Title.CrossPromotionId
            .PropertyRef("TitleCrossPromotionId")
            ;


        HasMany<CrossPromotionLinkUp>(c => c.AdvertisedPromotionLinkUp)
            .Table("dbo.CrossPromoLinkups")
            .Cascade.None()
            .Inverse()
            .LazyLoad()
            .KeyColumn("PromoTitleId"); //TitleCrossPromoId");

        HasMany<Issue>(c => c.Issues)
            .Table("dbo.Issues")
            .KeyColumn("TitleId")
            .LazyLoad()
            .Cascade.SaveUpdate();

CrossPromoLinkups 映射

        References(x => x.PromotionTitle, "PromoTitleId");
        References(x => x.TitleCrossPromotion, "TitleCrossPromoId")
            .Cascade.Delete()
            .LazyLoad()
            .PropertyRef("TitleCrossPromotionId");

请注意错误中它抱怨标题有很多的“问题”。当我尝试从 CrossPromoLinkups 中删除记录时,似乎正在尝试删除我认为的标题

var PromotionLinkupToDelete = PromotionLinkUp.SingleOrDefault(x => x.Id == crossPromoLinkupId);
PromotionLinkUp.Remove(PromotionLinkupToDelete);

我在映射上做错了什么?

谢谢

4

1 回答 1

0

因为我不想删除标题,所以我需要将参考映射更新为以下内容:

 References(x => x.PromotionTitle, "PromoTitleId")
                .Cascade.None(); //dont delete the title
于 2013-11-08T17:19:03.960 回答