2016-09-13 6 views
0

Entitiy Framework 6.1.3을 사용 중이고 N 테이블의 관계를 하나 이상의 조인 열이있는 1 개의 테이블에 추가하려고합니다. 이 열이EF6.1.3 열 결합 (최대 절전 모드에서)

표 P (프로토콜 테이블) : 다음 예제는 내 문제를 이해하는 데 도움이 될 것입니다

:

protocol_id (int, PK) 
message (string) 
module (string) 
reference_id (int) 

protocol_id | module | message | reference_id 
----------------------------------- 
1 | A | created | 1 
2 | A | modified | 1 
2 | A | created | 2 
3 | B | deleted | 1 
4 | B | modified | 1 

표 A는 이러한 열이 (A 테이블 모듈) 이러한 열

mod_id (int, PK) mod_x (string) mod_y (...) ... mod_id | mod_x | ... -------------------- 1 | abc | ... 2 | xyz | ... 

표 B (모듈 B 테이블)

012,351,
mod_id (int, PK) 
mod_x (string) 
mod_y (...) 
... 

mod_id | mod_x | ... 
-------------------- 
1 | abc | ... 
2 | xyz | ... 

내가이 행에 대한 모든 procotols를 얻기 위해 모듈 A의 탐색 속성을 가지고 싶습니다 - 그렇게 sthg :

where module = 'A' and reference_id = mod_id 

(모듈 B, 모듈 C에 대한 동일 ...)

Java/Hibernate에서 두 개 이상의 ElementJoinColumns (referenceColumnsNames, ...)를 사용할 수 있다는 것을 알고 있습니다.

어떻게 이것을 EF6.1로 처리 할 수 ​​있습니까? 고마워, 마커스.

답변

0

다음은 DDL입니다.

USE [Breaz] 
GO 
/****** Object: Table [dbo].[TableA] Script Date: 9/14/2016 3:25:43 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[TableA](
    [mod_id] [int] IDENTITY(1,1) NOT NULL, 
    [mod_x] [varchar](10) NULL, 
CONSTRAINT [PK_TableA_] PRIMARY KEY CLUSTERED 
(
    [mod_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[TableB] Script Date: 9/14/2016 3:25:43 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[TableB](
    [mod_id] [int] IDENTITY(1,1) NOT NULL, 
    [mod_x] [varchar](10) NULL, 
CONSTRAINT [PK_tableb] PRIMARY KEY CLUSTERED 
(
    [mod_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[TableP] Script Date: 9/14/2016 3:25:43 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[TableP](
    [protocol_id] [int] IDENTITY(1,1) NOT NULL, 
    [message] [varchar](10) NULL, 
    [module] [varchar](10) NULL, 
    [reference_id] [int] NULL, 
CONSTRAINT [PK_TableP] PRIMARY KEY CLUSTERED 
(
    [protocol_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 
ALTER TABLE [dbo].[TableP] WITH CHECK ADD CONSTRAINT [FK_TableP_tablea] FOREIGN KEY([reference_id]) 
REFERENCES [dbo].[TableA] ([mod_id]) 
GO 
ALTER TABLE [dbo].[TableP] CHECK CONSTRAINT [FK_TableP_tablea] 
GO 
ALTER TABLE [dbo].[TableP] WITH CHECK ADD CONSTRAINT [FK_TableP_tableb] FOREIGN KEY([reference_id]) 
REFERENCES [dbo].[TableB] ([mod_id]) 
GO 
ALTER TABLE [dbo].[TableP] CHECK CONSTRAINT [FK_TableP_tableb] 
GO 

지금 세 개의 테이블에 대한 edmx를 추가하고 LINQ는 다음과 같아야합니다 (대신 BreazEntities22 당신의 dbcontext 사용 :

을 당신이 설정 한 적절한 참조 무결성 (RI)가 중요하다
 var tableA = e.TableAs. 
      Where(w => w.TablePs.Any(s => s.module == "A")).ToList(); 

     var tableB = e.TableBs. 
      Where(w => w.TablePs.Any(s => s.module == "A")).ToList();