如何创建查找表并定义关系

Jac*_*ack 5 asp.net-mvc entity-relationship entity-framework entity-framework-6 ef-fluent-api

如下所示,有一个枚举值的查找表,我想在表的枚举值和查找表的LookupKey列(而不是查找表的 ID 列)之间创建关系。

查找表:

ID   | LookupType | LookupKey | LookupValue |
101  | Status     | 0         | Passive     | 
106  | Gender     | 1         | Male        | 
113  | Status     | 1         | Active      | 
114  | Gender     | 2         | Female      | 
118  | Status     | 2         | Cancelled   | 
Run Code Online (Sandbox Code Playgroud)


主表:

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      | ...
Run Code Online (Sandbox Code Playgroud)

但是,当在DataAnnotations - InverseProperty 属性上使用 PK-FK 关系和 InverseProperty 时,该关系是使用 Lookup 表的 ID 列创建的,我无法与 LookupKey 列建立关系。您能举例说明如何实现这一目标吗?

Ste*_*ene 3

我们这里有一个通用的查找表。它看起来和你的很相似。LookupData 有一个主键和一个 LookupTypes 的外键,相当于您的枚举和值。我们可能还有一些其他简单字段,例如在 LookupType 元数据表中标识的标志或代码。然后在主表中我们可能有“GenderLookupId”,它指向 LookupData.Id 字段。ID 本身没有任何意义,可以按任何顺序输入。如果您希望性别 1 和 2 有意义,您可能应该为此添加另一个属性(请参阅代理键)。

数据示例:

查找类型

ID    Description    CodeDesc        BooleanDesc  
1     Genders        Gender Code     NULL
2     Races          Race Code       Is Active
Run Code Online (Sandbox Code Playgroud)

查找数据

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
Run Code Online (Sandbox Code Playgroud)

主要名称表

NameId   Name          GenderLookupId   RaceLookupId
1234     Joe Smith     789              790
1235     Mary Meyers   791              792
Run Code Online (Sandbox Code Playgroud)

课程:

public class LookupType
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string CodeDescription { get; set; }
    public string BooleanDescription { get; set; }
Run Code Online (Sandbox Code Playgroud)

}

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; } 
Run Code Online (Sandbox Code Playgroud)

}

public class Name
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public int? GenderLookupId { get; set; }
    public LookupData Gender { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

查找数据配置:

HasRequired(p => p.LookupType).WithMany(p=>p.LookupData).HasForeignKey(p=>p.LookupTypeId).WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)

名称配置:

HasOptional(p => p.Gender).WithMany(p=>p.Name).HasForeignKey(p=>p.GenderLookupId).WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)