繁体   English   中英

Fluent Nhibernate如何在级联保存期间为非空列设置值

[英]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.

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