小编Ian*_*ers的帖子

EF/LINQ如何在存在双向关系时包含子实体

环境

我在Framework 4.0上使用Entity Framework 5.(这意味着我实际上使用的是EF 4.4).作为实体我使用STE(自我跟踪实体)因为我在N-Tier应用程序中工作.我们使用数据库驱动的方法,因为EF是在游戏后期引入的.

上下文

我有两个实体,彼此都有一个导航属性.(EntityA具有EntityB的导航属性,EntityB具有EntityA的导航属性).关系是'EntityA> One-To-Many> EntityB'.当我想通过LINQ表达式加载子实体时,我需要使用INCLUDE(S​​TE => Eager Loading),因为我将通过几个层传递所有数据.

代码

这是我的代码,用它的EntityB孩子调用EntityA.

using (var ctx = new MyEntities())
{
     var result = (from s in ctx.EntityA.Include("EntityB")
                   where s.Id = 11111
                   orderby s.TimeUpdated descending 
                   select s)
               .Take(10)
               .ToList();
     return result;
}
Run Code Online (Sandbox Code Playgroud)

错误

System.StackOverflowException {无法计算表达式,因为当前线程处于堆栈溢出状态.}

删除'INCLUDE'时没有错误.我想原因很简单.我想加载带有子记录EntityB的EntityA,EntityB记录每次都要加载其父EntityA,而EntityA ......我想每个人都理解这里的无限循环.

我的解决方案或替代品

  • 我转到我的EDMX文件并删除EntityB中EntityA的导航属性.如果我现在想要加载有关EntityA的数据,而我有一个EntityB供我使用.我需要做一个单独的DB请求,我有两个不同的对象,我必须通过我的层传递.
  • 避免使用include,单独加载EntityA并将其推送到我的EntityB的导航属性中,该属性引用我的EntityA.

这个问题

在我的情况下,有更好的替代方法或方法来解决这个问题吗 我应该继续提出我提出的替代方案吗?因为我希望有一个更好,更清洁的解决方案.

我感谢你的时间

伊恩

c# linq-to-entities entity-framework

7
推荐指数
1
解决办法
1632
查看次数

一对多和递归关系 - 要设置的强制值

环境

  • 框架4.5
  • 实体框架6(代码优先)

模型

描述

  • MainEntity一对多ChildEntity关系
  • ChildEntity一对多的递归ChildEntity关系

代码片段中的模型

public class MainEntity
{
    public long Id { get; set; }
    public virtual Collection<ChildEntity> ChildEntities { get; set; } 
}

public class ChildEntity
{
    public long Id { get; set; }
    public MainEntity ParentMainEntity { get; set; }
    public virtual Collection<ChildEntity> ChildEntities { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

注意:ChildEntity只有一层深的ChildEntities可以作为孩子.

问题

我能够坚持这个模型.这似乎工作正常.只有一个问题.当我存储ChildEntity具有父ChildEntity.该MainEntity_id字段为空,只有ParentChildEntityId设置.我希望始终设置MainEntity_Id字段的原因是用于性能查询.

如何强制MAINENTITY_ID字段始终在更深层次设置值?

c# entity-framework ef-code-first .net-4.5 entity-framework-6

5
推荐指数
1
解决办法
219
查看次数

如何评估内联 onclick?

我很好奇内联元素属性事件的内容是如何在幕后工作的。

我们从一个简单的函数开始

function handler(e) {
    console.log(e);
}
Run Code Online (Sandbox Code Playgroud)

用例 1

如果我们想将此处理程序添加到我们的按钮,我们可以这样做:

<button onclick="handler();">Click Me</button>
Run Code Online (Sandbox Code Playgroud)

单击哪个日志: undefined

公平地说,我们在不传递参数的情况下调用了一个函数。

用例 2

如果我们现在将按钮更改为将event用作参数:

<button onclick="handler(event);">Click Me</button>
Run Code Online (Sandbox Code Playgroud)

我们登录点击: MouseEvent{ ... }

现在我们记录事件,正如我们所期望的

用例 3

但是如果我们只指定函数名呢?

<button onclick="handler">Click Me</button>
Run Code Online (Sandbox Code Playgroud)

没发生什么事!,我希望只是给一个函数的引用,就可以了。因此,当“onlick”发生时,将使用正确的事件参数调用引用的函数。

用例 4

当我们在 javascript 中添加处理程序时:

const btn = document.getElementById('btn');
btn.onclick = handler;
Run Code Online (Sandbox Code Playgroud)

它可以工作,捕获事件并记录相关event对象。

结束语

无论我们传递给onclick=""内联的任何文本/内容/语句,它基本上都eval()在上面运行吗?当我们在 javascript ( btn.onclick = ...) 中附加它时,它会通过适当的过程来拦截事件,然后调用有界处理函数并通过它传递相应的事件对象(例如MouseEvent)?

快速笔记

需要明确的是,这是一个信息丰富的问题​​,要了解基本原理,而不管它被认为是好的还是坏的做法。目前不讨论这一点。

html javascript

5
推荐指数
1
解决办法
2000
查看次数