![](/img/trans.png)
[英](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.