2013-03-05 33 views
0

我有一个微不足道的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 < < L:M >>表2

如何我可以在Table2上编写一个关于两个给定列加入Table3的关系吗?

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

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

但我打了一个死胡同,因为我不能在表1列到表2中的列关联。谢谢!

+0

你已经有实体吗? – NunoCarmo 2013-03-05 22:10:20

+0

是的。它可能会提到我使用的是代码优先的方法,所以没有EDMX来设置协会或这种性质的东西。 – dparsons 2013-03-06 02:00:54

+0

我认为如果你可以在这里发布真实的实体,以便我们可以看到实际的场景,那将会很好。 – 2013-03-06 03:38:38

回答

1

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

0

正如拉迪斯拉夫指出的,你不能建立一个基于非关键列的关系,但这种情况在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的行为,我需要(做。加入一个INNER JOIN)并获得了我期望的数据集。话虽这么说,我最终被放弃这种做法,只是站起身来降低我的电话,只是一个观点:

context.ViewTable.Select... 

这只是表明你,只因为你可以做一些事情并不意味着你应该。 ;]