ark*_*tts 5 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; }
}
Run Code Online (Sandbox Code Playgroud)
我的流利映射如下:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
每当我尝试更新申请人(插入一个新的工作正常),它失败,我在日志中看到以下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.
Run Code Online (Sandbox Code Playgroud)
为什么NHibernate会尝试更新标记表并将Applicant_id设置为null?我对此感到茫然.
Hac*_*ese 13
设置Applicant.Tags为Inverse将指示NHibernate保存Tags后Applicant.
public class ApplicantMap : ClassMap<Applicant>
{
public ApplicantMap()
{
Id(x => x.Id);
HasMany(x => x.Tags).Cascade.All().Inverse();
}
}
Run Code Online (Sandbox Code Playgroud)
更多详情:
Inverse(相对于.Not.Inverse())意味着关系的另一方(在这种情况下,每个Tag)负责维持关系.因此,NHibernate知道Applicant必须先保存,以便Tag有一个有效的外键Applicant.
经验法则:包含外键的实体通常是所有者,因此另一个表应具有 Inverse
| 归档时间: |
|
| 查看次数: |
6231 次 |
| 最近记录: |