Asp.net mvc 如何创建查找表和定义关系

Asp.net mvc 如何创建查找表和定义关系,asp.net-mvc,entity-framework,entity-framework-6,entity-relationship,ef-fluent-api,Asp.net Mvc,Entity Framework,Entity Framework 6,Entity Relationship,Ef Fluent Api,正如您在下面看到的,有一个针对枚举值的查找表,我想在表的枚举值和查找表的LookupKey列(而不是查找表的ID列)之间创建一个关系 查找表: ID | LookupType | LookupKey | LookupValue | 101 | Status | 0 | Passive | 106 | Gender | 1 | Male | 113 | Status | 1 | Active

正如您在下面看到的,有一个针对枚举值的查找表,我想在表的枚举值和查找表的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      | ...

主表:

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      | ...

但是,在使用PK-FK关系和InverseProperty as时,该关系是使用查找表的ID列创建的,我无法与LookupKey列建立关系。你能举例说明如何做到这一点吗

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

数据示例:

查找类型

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

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

}

lookUpdatea配置:

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

为什么不选择向下投票而不是回答???为什么不使用ID列?不能单独使用查找键,因为它不是唯一的。我想你可以做一些棘手的事情,比如.HasForeignKey(m=>new{m.GenderLookupType,m.GenderLookupKey}),但是现在你的主表中有两个字段用于每个关系。除了ID列之外,LookupKey列还是主键对我有帮助吗?实际上,我目前使用ID列作为“ID”和“LookupKey”。但是,在这种情况下,由于将来添加了新值,查找键类似于1,2,7,25。另一方面,我希望按顺序创建LookupKey值,即1,2,3,4,。。。。那么,使用一个额外的键值,即“LookupKey”是不是一个坏主意?当开发人员尝试使用查找表时,这种情况下的一般用法是什么?他们是否将ID列同时用于record和LookupKey?你能澄清一下吗?非常感谢你的解释。就我所见,通过创建一个具有ID、LookupType和LookupKey列的新表,我的方法似乎与此类似。因此,请您逐一向我说明以下方法好吗?1)在将我的表转换为您的示例时,我创建了一个新表来定义LookupType(即性别、状态等),它是LookupTable的TypeID的FK。在这种情况下,我重复代码而不是查找表上的类型描述。这是真的吗?这种方法还有其他优点吗?2)通过使用这种方法,我将继续使用“InverseProperty”,以便对同一个表使用多个FK(LookUpdatea)?我的意思是,在主表中,仅添加引用LookUpdatea表的导航属性是不够的。例如,对于性别列LookUpdate,将使用nav属性,对于种族,也将使用nav属性。在这种情况下,应使用一种特殊的方法来引用与“逆属性”相同的表。你用什么?1-它只是简单的数据库规范化。2-我们不会在儿童查找中设置导航集合,也就是说,在种族或性别中没有名称集合,因为我们永远不需要以这种方式导航。我们只需在名称中添加一个流畅的配置,比如…HasOptional(n=>n.RaceLookup).WithMany().HasForeignKey(n=>n.RaceLookupId).WillCascadeOnDelete(false);