使用EntityFramework时,如果指定外键的两端只有一个,那么我很好奇是否有性能提升。假设我有一个大多数其他表使用的表,例如查找表。让我们说这个表LookupValue
有20个传入的外键,另一个表User
位于其中一个外键的另一端,通过列TypeId
。
LookupValue
------------------
Id INT <--\
Values NVARCHAR |
|
User | FK_User_NameValue
------------------ |
Id INT |
TypeId INT <--/
使用代码优先我按如下方式定义这些表:
modelBuilder
.Entity<LookupValue>()
.ToTable("LookupValue")
.HasKey(o => o.Id);
modelBuilder
.Entity<User>()
.ToTable("User")
.HasKey(o => o.Id)
.HasRequired(o => o.Type)
.WithMany(o => o.UsersOfThisType)
.HasForeignKey(o => o.TypeId);
我的问题是 ...
WithMany...HasForeignKey
部分是否必要或有帮助,以便更好地在这两个表之间生成查询?E.g:
modelBuilder
.Entity<User>()
.ToTable("User")
.HasKey(o => o.Id)
.HasRequired(o => o.Type);
答案 0 :(得分:0)
只要您只需要从User遍历到LookupValue,就可以在User中拥有accessor属性。如果不需要查找引用LookupValue的所有用户,则无需在LookupValue对象中具有ICollection
public class LookupValue
{
public int Id { get; set; }
public string Value { get; set; }
}
public class User
{
public int Id { get; set; }
public int TypeId { get; set; }
public LookupValue Type { get; set; }
}
实体框架将通过用户中的TypeId属性从用户生成到LookupValues的外键。我认为这是从用户到LookupValue的性能遍历所需要的。