Asp.net mvc 如何创建查找表和定义关系
正如您在下面看到的,有一个针对枚举值的查找表,我想在表的枚举值和查找表的LookupKey列(而不是查找表的ID列)之间创建一个关系 查找表: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
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);