C# Nhibernate类映射和级联属性

C# Nhibernate类映射和级联属性,c#,nhibernate,nhibernate-mapping,cascade,C#,Nhibernate,Nhibernate Mapping,Cascade,我们有一个地址实体,它有一个引用城市表的外键。一个地址只引用一个城市,但是一个城市应该能够被多个地址引用 public class Address : Entity { public virtual string AddressLine1 { get; set; } public virtual string AddressLine2 { get; set; } public virtual City City { get; set; } } public clas

我们有一个
地址
实体,它有一个引用
城市
表的外键。一个
地址
只引用一个
城市
,但是一个
城市
应该能够被多个
地址
引用

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; }
}
这是
地址
类映射

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);
            });
    }
}
公共类地址ClassMapping:ClassMapping
{
公共地址类映射()
{
这个模式(“dbo”);
本表(“地址”);
this.Cache(e=>e.Usage(CacheUsage.ReadWrite));
this.Id(e=>e.Id,
m=>{m.Column(“id_地址”);m.Generator(Generators.Native);};
属性(e=>e.AddressLine1,
m=>{m.Column(“address_line_1”);m.NotNullable(true);};
属性(e=>e.AddressLine2,
m=>{.Column(“地址行2”);
m、 不可为空(true);});
这是我的手机(
e=>e.城市,
m=>
{
m、 列(“id_城市”);
m、 Cascade(Cascade.All);
});
}
}
我应该如何更改类映射,以便:

  • 当我删除一个城市时,该城市的所有地址都会被删除
  • 当我删除一个地址时,城市是否不被触动
  • 我可以通过更新外键来更新地址的城市属性

  • 到目前为止,我已经使用了
    Cascade
    属性,并且遇到了这样的问题:对地址所在城市的更新会导致城市表的更新,或者在不违反外键约束的情况下,我无法删除地址。

    上面所示(这里也讨论过)的
    多对一部分可以设置为这些值

    // 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() 
    
    (请在此阅读更多)

    这将涵盖点编号。。。嗯,以上都没有。因为没有一个需求要求从地址到城市进行级联

    第3点:

  • 我可以通过更新外键来更新地址的城市属性
  • 这与级联无关。这是标准的behviour,即使没有级联也可以工作,因为它会更改地址表中的值。根本不接触城市

    为了涵盖第2点:

  • 当我删除一个地址时,城市是否不被触动
  • 好吧,我们应该完全取消级联,因为。。。在这个方向上不需要它。但是,此设置将适用于第2点

    this.ManyToOne(
        e => e.City,
        m =>
        {
            m.Column("id_city");
            m.Cascade(Cascade.Persist);
    
    关于第一点:

  • 当我删除一个城市时,该城市的所有地址都会被删除
  • 我们必须做很多事情。我们需要扩展POCO关系并引入一对多映射。这将完成所需的工作:

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

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

    (请在此阅读更多内容)

    谢谢!你能给我解释一下第二段的要点吗?
    m.Cascade.SaveUpdate()的作用是什么行吗?我很抱歉,我使用了fluent版本(正如您的标签告诉我的),而我应该使用代码映射-现在已修复,希望它有帮助我仍然不理解第二个片段的目的:(当我说“2.当我删除地址时,城市不受影响?”我的意思是说城市行仍将保留。一般来说,将多个行级联到一个行是非常特殊的。因此,您的解决方案很简单(如我所写)-删除该级联。仅保留城市行。这将满足您的所有需要。
    
    HasMany(x => x.Addresses)
        ...
        Cascade.AllDeleteOrphan();