【问题标题】:In Entity framework load child in parent entity (non primary key association)在实体框架中加载父实体中的子实体(非主键关联)
【发布时间】:2012-08-03 12:19:11
【问题描述】:

我对实体框架非常陌生,所以我不知道其中使用的技术术语。我很抱歉我的英语不好。

我正在一个项目中工作,其中包含实体框架并有一个.edmx 文件。该文件包含在其中创建的实体。

所以我创建了 2 个实体并将其命名为 TableA 和 TableB。 pid 是 TableA 的实体键, cid 是 TableB 的实体键。 并在其中创建了多对一的关系。 即 TableA row1 可以有 TableB_cid=1 TableA row2 也可以有 TableB_cid=2

然后我做了“从模型生成数据库”

CREATE TABLE [TableA] (
    [pid] nvarchar(max)  NOT NULL,
    [name] nvarchar(max)  NOT NULL,
    [TableB_cid] nvarchar(max)  NOT NULL
);
GO


CREATE TABLE [TableB] (
    [cid] nvarchar(max)  NOT NULL,
    [name] nvarchar(max)  NOT NULL
);

pid|name|TableB_cid
--------------------
1 | a | 2
2 | b | 2
3 | c | 1


cid|name
------------
1 | s
2 | f

现在我在 C# 代码中写了这个,

TableA obj = repository.All().Single(w=>w.pid == "1")
context.Entry<TableA>(obj).Reference<TableB>(o => o.TableB).Load();

现在这将加载 cid=1 的 TableB(但我真正想要的是加载 cid=2 的 TableB)。

我认为它的主键与主键匹配,而不是 TableB_cid (TableA) 与 cid (TableB) 匹配。

所以我做错了什么请帮忙。

编辑:
简而言之,我正在寻找一种方法,可以在 Entity Framework 4.0 中添加表 A 的非主列与表 B 的主列的关联。 而且我不想使用 linq 查询和连接。我已经尝试过,但我无法在 edmx 文件中找到可以做到的方法或选项。

谢谢,

M

【问题讨论】:

  • repository 是您的 DbContext 还是自定义服务层存储库? repository.All() 返回什么?
  • 嗨,AJ。存储库是自定义服务并使用工作单元,repository.All() 返回IQueryable&lt;Parent&gt;
  • 您确定 Child_Cid 应该在 Parents 表中吗?如果一个父母可以有很多孩子,那么 Children 表应该有 [Parent_Pid],对吧?
  • 嗨,富兰克林斯,我想我使用了错误的命名约定,所以现在我已经编辑了这个问题。
  • 现在一切看起来都不错,对吗?

标签: c# linq entity-framework linq-to-entities edmx


【解决方案1】:

我不确定我是否理解这个问题,但在您的示例中,您是否只是尝试访问 ID 为 1 的 TableA 的 TableB 实体?

如果是这样,怎么样:

TableA obj = repository.All().Single(w=>w.pid == "1");
TableB SecondTable = obj.TableB;

SecondTable.cid 应该是 2,is 和 obj.pid 应该是 1。如果不是,你得到什么值?

【讨论】:

  • 嗨,马克,我已附上快照。我正在尝试加载孩子,但加载了错误的孩子。我的意思是它采用 TableA 的主键,而不是 TableB_cid。
  • 我已根据您的新设置更新了我的帖子 - 这有帮助吗?
  • 我收到obj.TableB=null 我认为这是由于延迟加载。我应该怎么做才能加载它?
  • 加载导航属性:obj.TableB.Load();但是 - 我很好奇 FK 是什么 - 是 obj.TableB_cid == 2 吗?
  • 我附加了另一个快照,我无法检查 obj.TableB_cid 是什么,因为它不是 obj 的公共属性。
【解决方案2】:
    var childs = from c in context.Children
                      where c.cid = o.Child_cid;

我认为这应该对你有所帮助。

【讨论】:

  • 但由于某些原因,我无法使用 linq 查询。我想我在 edmx 中创建实体时缺少一些设置。我不知道是什么。
  • 您是否添加了 System.Linq 命名空间?
  • 嗨,安德烈,请看我的编辑。我不想使用 linq 查询,因为它不适合我的项目架构。
  • 也许以下链接会对您有所帮助。 blogs.msdn.com/b/adonet/archive/2009/11/06/…
  • 嗨,andre,我访问了链接并应用了相同的逻辑,但它返回了相同的错误结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多