模型中一个 属性 的多个数据库表

Multiple DB tables for one property in model

我有以下 类:

public class Customer {
    public virtual int Id {get; set;}
    public virtual string Surname {get; set;}
    public virtual string Prename {get; set;}
    public virtual Location Location {get; set;}
}

public class Location {
    public virtual int Id {get; set;}
    public virtual string ZipCode {get; set;}
    public virtual string Name {get; set;}
}

public class CustomLocation : Location {
}

以及以下映射:

public class CustomerMapping : ClassMapping<Customer> {
    public CustomerMapping(){
        Table("Customer");
        Property(a => a.Surname, b =>
        {
            b.NotNullable(true);
        });
        Property(a => a.Prename, b =>
        {
            b.NotNullable(true);
        });
        ManyToOne(a => a.Location, b =>
        {
            b.Column($"FK_Location_Id");
        });
}}

public class LocationMapping : ClassMapping<Location> {
    public LocationMapping(){
        Table("Location");
        Property(a => a.ZipCode, b =>
        {
            b.NotNullable(true);
        });
        Property(a => a.Name, b =>
        {
            b.NotNullable(true);
        });
}}

public class CustomLocationMapping : ClassMapping<CustomLocation>{
    public CustomLocationMapping(){
        Table("CustomLocation");
        Property(a => a.ZipCode, b =>
        {
            b.NotNullable(true);
        });
        Property(a => a.Name, b =>
        {
            b.NotNullable(true);
        });
}}

我的目标是我有一个由脚本自动更新的 Location table 和一个 CustomLocation table 用户可以在其中添加位置(如果有)有些人失踪了(或在国外)。

我的问题是,我不知道如何将其正确映射到 Customer,它可以是 LocationCustomLocation

有什么想法吗?提前致谢。

您不能将一个 属性 映射到两个不同 table 中的两列。 NHibernate 如何知道要使用哪个 table?您还将失去该列的参照完整性。

但是,您可以使用稍微不同的方法来实现您的目标:不要对同一结构使用两个 table,只需使用一个 Location-table以下 class 代表:

public class Location 
{
  public virtual int Id { get; set; }
  public virtual string ZipCode { get; set; }
  public virtual string Name { get; set; }
  public virtual bool IsSystem { get; set; } // just use a boolean column in the table for this one
}

您的脚本可以插入/更新/删除 IsSystem == true 所在的所有行并忽略其余行。当用户添加条目时,只需设置 IsSystem = false.