簡體   English   中英

Nhibernate類映射和層疊屬性

[英]Nhibernate class mapping and cascade property

我們有一個Address實體,它具有引用City表的外鍵。 一個Address僅引用一個City ,但是一個City應該能夠被多個Address引用。

public class Address : Entity
{
    public virtual string AddressLine1 { get; set; }

    public virtual string AddressLine2 { get; set; }

    public virtual City City { get; set; }
}

public class City : Entity
{       
    public virtual string CityName { get; set; }
}

這是Address類的映射。

public class AddressClassMapping : ClassMapping<Address>
{
    public AddressClassMapping()
    {
        this.Schema("dbo");
        this.Table("addresses");
        this.Cache(e => e.Usage(CacheUsage.ReadWrite));
        this.Id(e => e.Id, 
                m => { m.Column("id_address"); m.Generator(Generators.Native);});
        this.Property(e => e.AddressLine1, 
                      m => { m.Column("address_line_1"); m.NotNullable(true); });
        this.Property(e => e.AddressLine2, 
                      m => { .Column("address_line_2"); 
                      m.NotNullable(true); });
        this.ManyToOne(
            e => e.City,
            m =>
            {
                m.Column("id_city");
                m.Cascade(Cascade.All);
            });
    }
}

我應該如何更改類映射,以便:

  1. 刪除城市時,具有該城市的所有地址都會被刪除嗎?
  2. 當我刪除地址時,城市沒有被觸及嗎?
  3. 我可以通過更新外鍵來更新地址的城市屬性嗎?

到目前為止,我一直在玩Cascade屬性,並且遇到過這樣的問題,其中地址的城市更新導致City表的更新,或者我不能在不違反外鍵約束的情況下刪除地址。

可以將上面顯示的many-to-one一部分(也將在此處討論NHibernate多對一級聯設置為這些值

// xml
cascade="all|none|save-update|delete" 
// maping by code
Cascade.All | Cascade.None | Cascade.Persist | Cascade.Remove
// fluent 
Cascade.All() | Cascade.SaveUpdate() | Cascade.None() | Cascade.Delete() 

(在此處了解更多信息,按代碼映射-ManyToOne

這將涵蓋點號...以上都不是。 因為沒有任何要求要求從地址到城市的級聯。

要點3:

  1. 我可以通過更新外鍵來更新地址的城市屬性嗎?

與級聯無關。 這是標准行為,即使沒有級聯也可以工作,因為它會更改“地址”表中的值。 完全不接觸城市。

涵蓋要點2:

  1. 當我刪除地址時,城市沒有被觸及嗎?

好吧,我們應該完全刪除級聯,因為...在此方向上不需要。 但是,此設置將適合第2點

this.ManyToOne(
    e => e.City,
    m =>
    {
        m.Column("id_city");
        m.Cascade(Cascade.Persist);

涵蓋第一點:

  1. 刪除城市時,具有該城市的所有地址都會被刪除嗎?

我們必須做很多事情。 我們需要擴展POCO關系並引入一對多映射。 那將完成所需的工作:

public class City : Entity
{       
    public virtual IList<Address> Addresses { get; set; }
}

制圖

通過代碼映射:

Set(x => x.Addresses, c =>
{
   ...
   c.Cascade(Cascade.All.Include(Cascade.DeleteOrphans));

流利的版本

HasMany(x => x.Addresses)
    ...
    Cascade.AllDeleteOrphan();

(在此處了解更多信息,按代碼映射-套裝和袋子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM