简体   繁体   English

流利的NHibernate:外键不为空的问题

[英]Fluent NHibernate: foreign key not null problem

I have the following domain classes: 我有以下域类:

public class Installation : Entity<Installation>
{        
    public virtual string Name { get; set; }
    public virtual IList<Institution> Institutions { get; set; }

    public Installation()
    {
        Institutions = new List<Institution>();
    }
}
public class Institution : Entity
{
    public virtual string Name { get; set; }
    public virtual string Address { get; set; }
    public virtual string City { get; set; }
    public virtual Installation Installation { get; set; }        
}

I have made the Entity base class according to the following post . 我已经根据以下帖子制作了Entity基类。 I have the following mappings defined: 我定义了以下映射:

public class InstitutionMapping : ClassMap<Institution> 
{
    public InstitutionMapping()
    {
        WithTable("Institution");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        Map(i => i.Address).Not.Nullable().WithLengthOf(50);
        Map(i => i.City).Not.Nullable().WithLengthOf(50);
        References(i => i.Installation).ColumnName("InstallationId").Not.Nullable().WithForeignKey();
    }
}
public class InstallationMapping : ClassMap<Installation>
{
    public InstallationMapping()
    {
        WithTable("Installation");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        HasMany<Institution>(i => i.Institutions).KeyColumnNames.Add("InstallationId").Cascade.All();
    }
}

When I run the following code: 当我运行以下代码时:

Installation installation = TestHelper.CreateAnonymousInstallation();
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
session.Save(installation);

I get the following error: 我收到以下错误:

NHibernate.PropertyValueException: not-null property references a null or transient value. NHibernate.PropertyValueException:not-null属性引用一个null或瞬态值。

How to overcome the problem? 如何克服这个问题?

Thanks in advance Lukasz Glaz 在此先感谢Lukasz Glaz

I believe it's inverse=true that is needed. 我认为需要的是inverse = true。

HasMany<Institution>(i => i.Institutions)
   .KeyColumnNames.Add("InstallationId")
   .Cascade.All()
   .Inverse();

Or of course add a method in the installation class to handle this explicitly. 或者,当然要在安装类中添加一个方法来显式地处理此问题。

public class Installation : Entity<Installation>
{        
    public virtual string Name { get; set; }
    public virtual IList<Institution> Institutions { get; set; }

    public Installation()
    {
        Institutions = new List<Institution>();
    }

    public virtual void AddInstitution(Institution entity)
    {
        entity.Installation = this;
        Institutions.Add(entity);
    }
}

As I can see your Institution class has reference on Installation class. 如我所见,您的Institution类具有Installation类的参考。 And this reference is set to not null. 并且此引用设置为不为null。 When you are creating AnonymousInstitution do you set some Installation for it? 创建AnonymousInstitution时,是否为其设置了一些Installation?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM