gpt4 book ai didi

.net - Entity Framework : Get parent record with filtered child records

转载 作者:行者123 更新时间:2023-12-02 15:42:06 25 4
gpt4 key购买 nike

我对 EF 不太了解,但必须修复一些错误。其中一个错误发生如下:

  • 使用 ObjectContext 获取父记录(EF LINQ 查询)
  • 更改某些属性
  • 保存更改

问题是获取父记录,更具体地说是仅获取父记录的事件子项

这是当前的黑客:

var data =
(from q in Context.Questions.Include("Status").Include("Category")
where q.Id == id
select q).SingleOrDefault();

var atts = Context.Answers.Where(a => a.qId == id && a.active); // 1
data.Answers.Clear(); // 2
foreach (var att in atts)
{
data.Answers.Add(att); // 3
}

发生了什么:

  1. 从数据库中获取事件子记录
  2. 由于延迟加载,所有附件均从数据库中获取。然后立即清除该集合。 (EF跟踪将这些记录标记为“要删除”?)
  3. 循环所有事件记录并将它们再次添加到集合中(EF 跟踪将这些记录标记为“要插入”?)

更新时出现以下异常:操作失败:无法更改关系,因为一个或多个外键属性不可为空。当关系发生更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

我认为这是一个非常普遍的错误,发生的原因是 EF 对清除集合然后再次添加一些相同的记录感到困惑。

我的问题:如何仅获取事件子记录并使它们处于“未更改”状态,以便 EF 在任何时候都无法决定删除和重新插入我的记录。显然我也不想在更新时丢失非事件记录。

不是答案(或者是吗?):经常在 SO 和 Google 上找到,但无法让它发挥作用:

Context.ContextOptions.LazyLoadingEnabled = false;

var data =
(from q in Context.Questions.Include("Status").Include("Category")
where q.qId == id
select new
{
Question = q,
Answers = q.Answer.Where(a => a.active)
}).ToArray().Select(q => q.Question).FirstOrDefault();

return data; // Does not contain the answers... :(

最佳答案

您可以显式加载该属性,而不是加载它,然后清除它。这将防止在对象图中加载不需要的对象,因此当您断开非事件实体的连接时不会收到错误。

var data =
(from q in Context.Questions.Include("Status").Include("Category")
where q.Id == id
select q).SingleOrDefault();

Context.Entry(data).Collection(b => b.Answers).Query()
.Where(a => a.active)
.Load();

关于.net - Entity Framework : Get parent record with filtered child records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15137474/

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