将代码优先与 EF 一起使用引用表的正确方法是什么?高效搜索的核心



对EF来说相当新。核心和我遇到了一些问题,因为我的表格开始变得越来越复杂。 下面是我为类定义的内容的示例。注意。。。列和表比我在下面定义的要多得多。为了简洁起见,我将它们配对了。

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; }
}

我希望能够发出以下查询并包含用户表,以便我可以使用用户表中的列填充 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);
}

我正在视图模型中加载用户的名字和姓氏,以及引用的各种表中的任何其他属性。 我遇到的问题是我在迁移创建时收到错误">外键约束可能会导致循环或多个级联路径。"当然,如果我从JournalEntry类中删除读取公共虚拟用户用户 { get; set; }的行,那么问题就会消失(正如人们所期望的那样(。

我相信我做模型的方式是不正确的。我应该对这些模型进行编码的推荐方法是什么?我听说过"延迟加载"。这就是我应该朝着的方向前进的方向吗?

谢谢一堆。

---瓦尔

您的查询返回的是IQueryable<JournalEntry>而不是JournalEntry。 更改代码以从第一个对象获取用户详细信息:

var myViewModel.UserName = ($"{journalEntries.First().User.FirstName} {journalEntries.First().User.LastName}");

在上面的一行中,我正在调用您的日记条目集合的First(),这将有一个User.然后我可以访问FirstNameLastName.

另外,不要打扰LazyLoading,因为您正在学习。如果使用不当,可能会导致select n+1问题

相关内容

最新更新