gpt4 book ai didi

c# - DbSet.ToList() 种子其他数据库集

转载 作者:行者123 更新时间:2023-11-30 23:02:53 25 4
gpt4 key购买 nike

我在我的应用程序中使用 Entity Framework ,我有一个像这样的一对多模型:

public class Email
{
public string Id { get; set; }
public string To { get; set; }
public string From { get; set; }
public string CC { get; set; }
public string Bcc { get; set; }

public string Subject { get; set; }
public string Body { get; set; }

public ICollection<AnexoEmail> Anexos{get;set;}
}

public class AnexoEmail
{
[Key]
public string Id { get; set; }

/// <summary>
/// Full path do ficheiro
/// </summary>
public string Nome { get; set; }
public DateTime DataEnvio { get; set; }
public bool Enviado { get; set; }

public string EmailId { get; set; }
public Email Email { get; set; }
}

它代表了一个电子邮件附件关系。问题是我有一个 UOW 和存储库 EmailRepository 并且发生了一些我无法理解的事情:在存储库上:

public class EmailRepository : IEmailRepository
{
internal DbContext _context;
internal DbSet<Email> dbSet;
internal DbSet<AnexoEmail> dbSetAnexo;

public EmailRepository(DbContext context)
{
_context = context;
dbSet = context.Set<Email>();
dbSetAnexo = context.Set<AnexoEmail>();
}
(...)
public IEnumerable<Email> GetAll()
{
dbSetAnexo.ToList(); //<- I can´t understand this part

var emails = dbSet.ToList();
return email;
}
}

在此示例中,我希望 emails.Anexosnull,但出于某种原因,如果我添加该行 emails.Anexos 获取正确的附件 (anexos),如果我不这样做,emails.Anexos 将按预期为空。

我在 Ef 核心方面没有太多经验,如果我错过了一些类(class)或任何事情,请告诉我。

谢谢。

最佳答案

这都是entity tracking造成的. dbSetAnexo.ToList(); 行导致 Entity Framework track 整个 DbSet,您可以将其视为一种缓存形式,如果您喜欢。因为 EF 已经“缓存”了那些 AnexoEmail 对象,所以它会在您请求 email.Anexos 的值时将它们呈现给您。

您可以使用 AsNoTracking() 来防止这种情况发生扩展方法,例如:

dbSetAnexo.AsNoTracking().ToList();

现在,您应该做的是使用 Include 函数,它将强制 EF 到 load up the specified related children .例如:

var emails = dbSet
.Include(e => e.Anexos)
.ToList();

关于c# - DbSet.ToList() 种子其他数据库集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50238859/

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