[英](Fluent) NHibernate: HasMany/References (bidirectional) + Cascade Save
[英]Fluent Nhibernate how to set values for not null columns during cascade save
我有以下关系表:
public class Physicians
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual List<Specialty> Specialties{ get; set; }
public virtual User CreatedBy { get; set; }
}
public class Specialties
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual User CreatedBy { get; set; }
}
public class PhysicianSpecialtyBridge
{
public virtual Physicians Physician{get; set;}
public virtual Specialties Specialty { get; set; }
public virtual User CreatedBy { get; set; }
}
在映射中,我指定为
HasManyToMany(physician => physician.Specialties).Table("PhysicianSpecialty")
.ParentKeyColumn("Physician").ChildKeyColumn("Specialty").Cascade.All;
当我尝试将Physician与专业列表相关联并进行保存时,我遇到的问题是,由于PhysicianSpecialtyBridge中的createdby键不为null,因此尝试插入到桥接表时失败。 当我使列为可空时,一切正常。 这个问题有解决方案吗? 由于某种原因,我还需要在桥表中维护“ CreatedBy”。
这里的问题是,当您使用many-to-many
映射时,C#实体表示不同的关系。 在方案中使用Many-to-many
时,当1)我们有一个配对表,但1)没有用于表示的C#实体。
A)我建议,如果要将配对对象保留为C#实体以更改模型。 应该是这样的:
1)配对表应具有自己的替代密钥
public class PhysicianSpecialtyBridge
{
// the pairing object should have the ID
public virtual int Id { get; set; }
public virtual Physician Physician { get; set; }
public virtual Speciality Speciality{ get; set; }
...
2)另一个对象应列出配对对象(注意,我在实体名称中使用单数形式)
public class Physician
{
...
public virtual List<PhysicianSpecialtyBridge> Specialties{ get; set; }
public class Specialty
{
...
public virtual List<PhysicianSpecialtyBridge> Physicians{ get; set; }
然后配对对象的映射就像
References( x => x.Physician);
References( x => x.Specialty);
现在,医师与配对对象one-to-many
HasMany(x => x.Specialties)
.Inverse()
.Cascade.All();
特色相似
HasMany(x => x.Physicians)
.Inverse()
.Cascade.All();
B)如果您确实想要多对多,则必须删除配对对象。 C#实体将如下所示:
public class Physician
{
...
public virtual List<Specialty> Specialties{ get; set; }
public class Specialty
{
...
public virtual List<Physician> Physicians{ get; set; }
和映射
内科医生
HasManyToMany(x => x.Specialties)
.Table("PhysicianSpecialty")
.ParentKeyColumn("Specialty")
.ChildKeyColumn("Physician")
.Inverse()
//.Cascade.All() - NO Cascade, pairing table will be managed by default
;
特色菜
HasManyToMany(x => x.Physicians)
.Table("PhysicianSpecialty")
.ParentKeyColumn("Physician")
.ChildKeyColumn("Specialty")
// .Inverse() - NOT INVERSE, only one can be
// .Cascade.All() - NO Cascade, that will remove the Speciality
;
A)方法更好,建议使用。 优点之一是,您的配对对象可以具有更多属性(例如,CreatedBy或Order ... IsActive)...,并且您还可以通过子查询搜索具有某些特殊类型的医师
请检查第24章 。 提取
不要使用奇异的关联映射。
真正的多对多关联的好用例很少。 大多数时候,您需要存储在“链接表”中的其他信息。 在这种情况下,最好将两个一对多关联用于中间链接类。 实际上,我们认为大多数关联是一对多和多对一的,在使用任何其他关联样式时应格外小心,并问自己是否真的必要。
您还可以检查Nhibernate:如何用一对多关系表示多对多关系? 有关多对多替代方案的更多详细信息。 有关子查询优点的一些信息可以在这里找到https://stackoverflow.com/a/14080092/1679310
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.