模型中一个 属性 的多个数据库表
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
,它可以是 Location
或 CustomLocation
。
有什么想法吗?提前致谢。
您不能将一个 属性 映射到两个不同 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
.
我有以下 类:
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
,它可以是 Location
或 CustomLocation
。
有什么想法吗?提前致谢。
您不能将一个 属性 映射到两个不同 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
.