不基于主键创建流畅的关系

时间:2013-03-05 20:39:16

标签: c# .net entity-framework ef-code-first

我有一个简单的SQL查询,我试图使用Fluent API和实体框架,但我有一个粗略的。这是查询:

 SELECT     
  tbl1.Column,      
  tbl2.Column,  
  tbl3.Column,
  tbl4.Column
 FROM dbo.Table1 tbl1  
 INNER JOIN dbo.Table2 tbl2 ON tbl1.[Table 2 ID FK] = tbl2.ID
 LEFT JOIN dbo.Table3 tbl3  ON tbl3.[NonKeyColumn] = tbl2.[NonKeyColumn]
 LEFT JOIN dbo.Table4 tbl4 ON tbl4.[Table1FK] = tbl1.ID

我的问题是表2和表3的连接;列不是任何一个表的主键,并且在两个表中命名完全不同。表格之间的关系如下:

表1<< M:1>表2

表3<< M:1>表2

表4<< M:M>>表2

如何在Table2上编写一个将在两个给定列上加入Table3的关系?

我认为这是向正确方向迈出的一步(在表1中定义):

 this.HasMany(e => e.Table2)
     .WithOptional(e => e.Table1)
     .HasForeignKey(tlb2 => tbl2.Column)

但由于我无法将Table1中的列与Table2中的列相关联,因此我遇到了死胡同。谢谢!

2 个答案:

答案 0 :(得分:1)

你不能写这种关系。这需要NonKeyColumn Table2中的唯一键,但EF不支持唯一键=> EF不支持基于非主键的关系。

答案 1 :(得分:0)

正如Ladislav所指出的,你不能建立一个基于非关键列的关系,但这种情况在EF中并不一定是不可能完成的...它只是非常混乱。为了实现我只想使用LINQ和EF做的事情,查询结束了,基本上,结构与此类似:

 var values = context.Table1.Select()
                        .GroupJoin(
                                    context.Table2.Select(),
                                    detail => detail.ID,
                                    entry => entry.ID,
                                    (detail, entry) =>
                                        new { //select columns })
                                     .DefaultIfEmpty()
                                     .GroupJoin(
                                            context.Table3.Select(),
                                            entry => entry.Id,
                                            check => check.NonKeyColumn,
                                            (entry, check) => new {//select additional columns})
                                     .DefaultIfEmpty()
                                     .GroupJoin(
                                            context.Table4.Select(),
                                            entry => entry.ID,
                                            transactions => transactions.ID,
                                            (entry, transactions) => new {//select additional columns})
                                     .DefaultIfEmpty();

使用GroupJoins我能够获得我需要的LEFT JOIN行为(.Join做INNER JOIN)并获得我期望的数据集。话虽这么说,我最终放弃了这种方法,只是提出了一个观点,减少了我的呼吁:

  context.ViewTable.Select...

这只会告诉你,仅仅因为你可以做某事并不一定意味着你应该这样做。 ]