如何创建Lookup表并定义关系

时间:2015-03-29 19:30:56

标签: asp.net-mvc entity-framework entity-framework-6 entity-relationship ef-fluent-api

正如您在下面看到的,有一个用于枚举值的Lookup表,我想在表的枚举值和Lookup表的 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   | 


主表:

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表的ID列创建关系,并且我无法与LookupKey列建立关系。你能举例说明如何实现这个目标吗?

1 个答案:

答案 0 :(得分:3)

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

数据示例:

LookupType

ID    Description    CodeDesc        BooleanDesc  
1     Genders        Gender Code     NULL
2     Races          Race Code       Is Active

LookupData

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

主要名称表

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; } 
}

LookupData配置:

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);