nhibernate - Fluent NHibernate 一对多关系设置外键为空

标签 nhibernate fluent-nhibernate fluent-nhibernate-mapping

我有一个简单的 Fluent NHibernate 模型,其中包含两个相关类:

public class Applicant
    {
        public Applicant()
        {
            Tags = new List<Tag>();
        }

        public virtual int Id { get; set; }

        //other fields removed for sake of example

        public virtual IList<Tag> Tags { get; protected set; }

        public virtual void AddTag(Tag tag)
        {
            tag.Applicant = this;
            Tags.Add(tag);
        }
    }


public class Tag
{
    public virtual int Id { get; protected set; }
    public virtual string TagName { get; set; }

    public virtual Applicant Applicant { get; set; }
}

我的流畅映射如下:
public class ApplicantMap : ClassMap<Applicant>
    {
        public ApplicantMap()
        {
            Id(x => x.Id);

            HasMany(x => x.Tags).Cascade.All();
        }
    }

    public class TagMap : ClassMap<Tag>
    {
        public TagMap()
        {
            Id(x => x.Id);
            Map(x => x.TagName);

            References(x => x.Applicant).Not.Nullable();
        }
    }

每当我尝试 更新 一个申请人(插入一个新的工作正常),它失败了,我在日志中看到以下 SQL 异常:
11:50:52.695 [6] DEBUG NHibernate.SQL - UPDATE [Tag] SET Applicant_id = null WHERE Applicant_id = @p0;@p0 = 37 [Type: Int32 (0)] 
11:50:52.699 [6] ERROR NHibernate.AdoNet.AbstractBatcher - Could not execute command: UPDATE [Tag] SET Applicant_id = null WHERE Applicant_id = @p0 System.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'Applicant_id', table 'RecruitmentApp.dbo.Tag'; column does not allow nulls. UPDATE fails.

为什么 NHibernate 试图更新标签表并将申请者 ID 设置为空?我对这个不知所措。

最佳答案

套装Applicant.TagsInverse将指示 NHibernate 保存 TagsApplicant .

public class ApplicantMap : ClassMap<Applicant>
{
    public ApplicantMap()
    {
        Id(x => x.Id);

        HasMany(x => x.Tags).Cascade.All().Inverse();
    }
}

更多详情:
Inverse (与 .Not.Inverse() 相反)意味着关系的另一方(在这种情况下,每个 Tag )负责维护关系。因此,NHibernate 知道 Applicant必须先保存,以便 Tag它的 Applicant 有一个有效的外键.

经验法则:包含外键的实体通常是所有者,所以另一个表应该有 Inverse

关于nhibernate - Fluent NHibernate 一对多关系设置外键为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11213274/

相关文章:

sqlite - NHibernate 中与数据库无关的随机顺序

c# - 如何使用 Fluent Nhibernate 映射覆盖将子字符串映射到属性?

.net - NHibernate-强制转义表名

asp.net-mvc - 有人可以解释一下 CaSTLe Windsor 在我的应用程序中是如何工作的吗?

c# - NHibernate LINQWhere 和 Any 抛出异常

nhibernate - NHibernate 中的 hilo 错误 - "could not read a hi value - you need to populate the table"

nhibernate - SetCacheable抛出IndexOutOfBoundsException

nhibernate - Fluent NHibernate - 级联所有删除孤儿在删除时不做任何事情

c# - 使用鉴别器的 Fluent NHibernate 的多级继承

nhibernate - 将不可变结构映射为 NHibernate 中的组件