使用实体框架定义关系/ FK的两端是否重要?

时间:2016-08-10 14:30:12

标签: c# sql-server entity-framework linq foreign-keys

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

我的问题是 ...

  • 对于EF来说,WithMany...HasForeignKey部分是否必要或有帮助,以便更好地在这两个表之间生成查询?
  • 导航属性除了通过代码导航之外还有其他任何作用吗?
  • 如果我没有指定关系的另一端,EF会不会知道这个外键关系?

E.g:

modelBuilder
    .Entity<User>()
    .ToTable("User")
    .HasKey(o => o.Id)
    .HasRequired(o => o.Type);

1 个答案:

答案 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的性能遍历所需要的。

SQL Server Management Studio foreign key properties window