使用 Code First 和 EF.Core 来引用表以有效搜索的正确方法是什么
What's the correct way to reference tables using Code First with EF.Core for searching efficiently
对 EF.Core 相当陌生,我遇到了一些问题,因为我的表格开始变得越来越复杂。这是我为 classes 定义的示例。 注意...列和表比我在下面定义的要多得多。为了简洁起见,我将它们配对。
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Active { get; set; }
}
其次是
public class JournalEntry
{
public int Id { get; set; }
public int UserId { get; set; }
public string Details { get; set; }
public DateTime DateEntered { get; set; }
public virtual User User { get; set; }
}
我希望能够发出以下查询并包含用户 Table 这样我就可以使用用户 [=46] 的列填充 ViewModel =] 无需进行另一次查找并在检索数据时对数据进行排序:
public IQueryable<JournalEntry> GetByUser(int userId)
{
return _DbContext.JournalEntries.Where(j => j.UserId == userId)
.Include(u => u.User)
.OrderBy(u=> u.User.FirstName)
.ThenBy(j => j.DateEntered);
}
然后我的控制器将具有类似于以下内容的内容:
public IActionResult List(int userId)
{
var journalEntries = new _dbRepository.GetByUser(userId);
var myViewModel = new MyViewModel();
myViewModel.UserName = ($"{journalEntries.User.FirstName} {journalEntries.User.LastName}");
myViewModel.Entries = journalEntries;
etc ....
return View(myViewModel);
}
我正在视图模型中加载用户的名字和姓氏以及引用的各种表中的任何其他属性。我遇到的问题是我在创建迁移时遇到错误“外键约束可能导致循环或多个级联路径。”当然,如果我删除该行读取 public 虚拟用户用户 { get;放; } 从 JournalEntry class 然后问题就消失了(正如人们所期望的那样)。
我认为我制作模型的方式不正确。我应该对这些模型进行编码的推荐方式是什么?我听说过“延迟加载”。这是我应该朝着的方向吗?
非常感谢。
--- 值
您的查询 returns IQueryable<JournalEntry>
而不是 JournalEntry
。
更改代码以从第一个对象获取用户详细信息:
var myViewModel.UserName = ($"{journalEntries.First().User.FirstName} {journalEntries.First().User.LastName}");
在上面的行中,我在您的日记条目集合上调用了 First()
,这将有一个 User
。然后我可以访问 FirstName
和 LastName
.
此外,LazyLoading
既然你正在学习,就不要理会。如果使用不当可能会导致 select n+1
问题
对 EF.Core 相当陌生,我遇到了一些问题,因为我的表格开始变得越来越复杂。这是我为 classes 定义的示例。 注意...列和表比我在下面定义的要多得多。为了简洁起见,我将它们配对。
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool Active { get; set; }
}
其次是
public class JournalEntry
{
public int Id { get; set; }
public int UserId { get; set; }
public string Details { get; set; }
public DateTime DateEntered { get; set; }
public virtual User User { get; set; }
}
我希望能够发出以下查询并包含用户 Table 这样我就可以使用用户 [=46] 的列填充 ViewModel =] 无需进行另一次查找并在检索数据时对数据进行排序:
public IQueryable<JournalEntry> GetByUser(int userId)
{
return _DbContext.JournalEntries.Where(j => j.UserId == userId)
.Include(u => u.User)
.OrderBy(u=> u.User.FirstName)
.ThenBy(j => j.DateEntered);
}
然后我的控制器将具有类似于以下内容的内容:
public IActionResult List(int userId)
{
var journalEntries = new _dbRepository.GetByUser(userId);
var myViewModel = new MyViewModel();
myViewModel.UserName = ($"{journalEntries.User.FirstName} {journalEntries.User.LastName}");
myViewModel.Entries = journalEntries;
etc ....
return View(myViewModel);
}
我正在视图模型中加载用户的名字和姓氏以及引用的各种表中的任何其他属性。我遇到的问题是我在创建迁移时遇到错误“外键约束可能导致循环或多个级联路径。”当然,如果我删除该行读取 public 虚拟用户用户 { get;放; } 从 JournalEntry class 然后问题就消失了(正如人们所期望的那样)。
我认为我制作模型的方式不正确。我应该对这些模型进行编码的推荐方式是什么?我听说过“延迟加载”。这是我应该朝着的方向吗?
非常感谢。
--- 值
您的查询 returns IQueryable<JournalEntry>
而不是 JournalEntry
。
更改代码以从第一个对象获取用户详细信息:
var myViewModel.UserName = ($"{journalEntries.First().User.FirstName} {journalEntries.First().User.LastName}");
在上面的行中,我在您的日记条目集合上调用了 First()
,这将有一个 User
。然后我可以访问 FirstName
和 LastName
.
此外,LazyLoading
既然你正在学习,就不要理会。如果使用不当可能会导致 select n+1
问题