如何创建 Lookup table 和定义关系
How to create Lookup table and define relationships
正如您在下面看到的,枚举值有一个查找 table,我想在 table 的枚举值和 LookupKey 之间创建一个关系查找 table 的 列(而不是查找 table 的 ID 列)。
查找table:
ID | LookupType | LookupKey | LookupValue |
101 | Status | 0 | Passive |
106 | Gender | 1 | Male |
113 | Status | 1 | Active |
114 | Gender | 2 | Female |
118 | Status | 2 | Cancelled |
主要Table:
ID | Status | Gender | Name | ...
1 | 0 | 1 | John Smith | ...
2 | 1 | 2 | Christof Jahnsen | ...
3 | 2 | 1 | Alexi Tenesis | ...
4 | 0 | 2 | Jurgen Fechtner | ...
5 | 1 | 2 | Andreas Folk | ...
但是,当在 DataAnnotations - InverseProperty Attribute 上使用 PK-FK 关系和 InverseProperty 时,关系是使用 Lookup table 的 ID 列创建的,我无法与 LookupKey 列建立关系。你能举例说明如何实现这一目标吗?
我们在这里有一个共同的查找 table。它看起来和你的很像。 LookupData 有一个主键和一个 LookupTypes 的外键,相当于您的枚举和值。我们可能还有一些其他简单的字段,例如在 LookupType 元数据 table 中标识的标志或代码。然后在 out main table 中,我们可能有 "GenderLookupId" 指向 LookupData.Id 字段。 ID 本身没有意义,可以按任何顺序输入。如果您希望性别 1 和 2 有意义,您可能应该为此添加另一个属性(参见代理键)。
数据示例:
查找类型
ID Description CodeDesc BooleanDesc
1 Genders Gender Code NULL
2 Races Race Code Is Active
查找数据
ID LookupTypeId Description Code Boolean
789 1 Male M NULL
790 2 White W True
791 1 Female F NULL
792 2 Hispanic H False
主要姓名Table
NameId Name GenderLookupId RaceLookupId
1234 Joe Smith 789 790
1235 Mary Meyers 791 792
类:
public class LookupType
{
public int Id { get; set; }
public string Description { get; set; }
public string CodeDescription { get; set; }
public string BooleanDescription { get; set; }
}
public class LookupData
{
public int Id { get; set; }
public int LookupTypeId { get; set; }
public string Description { get; set; }
public string Code { get; set; }
public bool? BooleanValue { get; set; }
public LookupType LookupType { get; set; }
}
public class Name
{
public int Id { get; set; }
public string FullName { get; set; }
public int? GenderLookupId { get; set; }
public LookupData Gender { get; set; }
}
查找数据配置:
HasRequired(p => p.LookupType).WithMany(p=>p.LookupData).HasForeignKey(p=>p.LookupTypeId).WillCascadeOnDelete(false);
名称配置:
HasOptional(p => p.Gender).WithMany(p=>p.Name).HasForeignKey(p=>p.GenderLookupId).WillCascadeOnDelete(false);
正如您在下面看到的,枚举值有一个查找 table,我想在 table 的枚举值和 LookupKey 之间创建一个关系查找 table 的 列(而不是查找 table 的 ID 列)。
查找table:
ID | LookupType | LookupKey | LookupValue |
101 | Status | 0 | Passive |
106 | Gender | 1 | Male |
113 | Status | 1 | Active |
114 | Gender | 2 | Female |
118 | Status | 2 | Cancelled |
主要Table:
ID | Status | Gender | Name | ...
1 | 0 | 1 | John Smith | ...
2 | 1 | 2 | Christof Jahnsen | ...
3 | 2 | 1 | Alexi Tenesis | ...
4 | 0 | 2 | Jurgen Fechtner | ...
5 | 1 | 2 | Andreas Folk | ...
但是,当在 DataAnnotations - InverseProperty Attribute 上使用 PK-FK 关系和 InverseProperty 时,关系是使用 Lookup table 的 ID 列创建的,我无法与 LookupKey 列建立关系。你能举例说明如何实现这一目标吗?
我们在这里有一个共同的查找 table。它看起来和你的很像。 LookupData 有一个主键和一个 LookupTypes 的外键,相当于您的枚举和值。我们可能还有一些其他简单的字段,例如在 LookupType 元数据 table 中标识的标志或代码。然后在 out main table 中,我们可能有 "GenderLookupId" 指向 LookupData.Id 字段。 ID 本身没有意义,可以按任何顺序输入。如果您希望性别 1 和 2 有意义,您可能应该为此添加另一个属性(参见代理键)。
数据示例:
查找类型
ID Description CodeDesc BooleanDesc
1 Genders Gender Code NULL
2 Races Race Code Is Active
查找数据
ID LookupTypeId Description Code Boolean
789 1 Male M NULL
790 2 White W True
791 1 Female F NULL
792 2 Hispanic H False
主要姓名Table
NameId Name GenderLookupId RaceLookupId
1234 Joe Smith 789 790
1235 Mary Meyers 791 792
类:
public class LookupType
{
public int Id { get; set; }
public string Description { get; set; }
public string CodeDescription { get; set; }
public string BooleanDescription { get; set; }
}
public class LookupData
{
public int Id { get; set; }
public int LookupTypeId { get; set; }
public string Description { get; set; }
public string Code { get; set; }
public bool? BooleanValue { get; set; }
public LookupType LookupType { get; set; }
}
public class Name
{
public int Id { get; set; }
public string FullName { get; set; }
public int? GenderLookupId { get; set; }
public LookupData Gender { get; set; }
}
查找数据配置:
HasRequired(p => p.LookupType).WithMany(p=>p.LookupData).HasForeignKey(p=>p.LookupTypeId).WillCascadeOnDelete(false);
名称配置:
HasOptional(p => p.Gender).WithMany(p=>p.Name).HasForeignKey(p=>p.GenderLookupId).WillCascadeOnDelete(false);