簡體   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