gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:48:12 27 4
gpt4 key购买 nike

使用 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 的高效遍历所需的全部内容。

SQL Server Management Studio foreign key properties window

关于c# - 使用 Entity Framework 定义关系/FK 的两端是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876291/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com