c# - 使用 Entity Framework 定义关系/FK 的两端是否重要?

使用 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 部分对 EF 是否必要或有帮助,以便更好地在这两个表之间生成查询?
  • 除了通过代码导航之外,导航属性是否还有其他作用?
  • 或者如果我没有指定关系的另一端,EF 会知道这个外键关系吗?

例如:

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

最佳答案

只要只需要从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; }
}

Entity Framework 将通过 Users 中的 TypeId 属性生成一个从 Users 到 LookupValues 的外键。我认为这就是从 Users 到 LookupValue 的高效遍历所需的全部内容。

https://stackoverflow.com/questions/38876291/

相关文章:

google-maps - 谷歌地图 -> 根据给定距离制作环形路线?

mysql - 如何匹配两个表之间varchar字段中的字符串

python - 在 Python 中查找对称矩阵的 SVD

maven - 如何配置 pom.xml 文件以使用 Nexus Repository manage

makefile - GNU make - 在另一个 makefile 中引用目标

android - firebase 重复用户名和自定义登录

python - 冲突的 OpenCV 和 Matplotlib

php - 模拟 Controller 从 WebTestCase 调用的服务

android - 如果暂停时间太长,为什么应用程序无法从最近启动

c++ - 如何从 MAC 中的/Library/Framework 文件夹中包含 C++ 中的文件