我会让这真的很简单。
我有两张 table 。
public class User
{
public virtual int UserId { get; set; } //primary key AND foreign key
//user attributes in here
public virtual UserProfile UserProfile { get; set; }
}
public class UserProfile
{
public virtual int UserId { get; set; } //primary key AND foreign key
//profile attributes in here
public virtual User User { get; set; }
}
基本上,它们是两个以 1-1 关系共享主键的表。这些是否应该合并为一个,我不知道,我是基于现有的数据库进行的。
现在,我遇到的问题是我何时访问它。
这个代码很快(第二个,也许两个):
List<User> userList; //**This userList is defined elsewhere, but it's a list of about 400 users.
foreach (User user in userList)
{
var test = user.FirstName;
}
这个代码真的很慢(10-30 秒):
List<User> userList; //**This userList is defined elsewhere, but it's a list of about 400 users.
foreach (User user in userList)
{
var test = user.UserProfile.EmailAddress;
}
当我从用户表访问 UserProfile 时,为什么我的代码需要这么长时间?!
最佳答案
可能是因为你在这里懒加载 UserProfile
。这意味着对于循环中的每次迭代,当您尝试访问电子邮件地址时,您会单独调用数据库以加载 UserProfile
。
我不确定您是如何创建 userList
集合的,但假设您正在对 User
表进行简单查询,您可以使用 Include
预先加载您想要预先拥有的任何属性:
var userList = (from u in dbContext.Users.Include("UserProfile")
select u)
现在,性能影响仅限于最初执行此查询时,枚举结果将不再需要单独调用数据库。
关于c# - Entity Framework 中一对一外键的巨大性能影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12322234/