2012-05-17 2 views
0

나는 다음과 같은 테이블과 관계가 있다고 가정 : 나는 각 데이터베이스 컬럼의 속성 간단한 POCO 클래스를 생성하는 일부 T4 템플릿을 사용하고T4 관계 발전

CREATE TABLE [dbo].[Customers] (
    [CustomerID] [int] IDENTITY(1,1) NOT NULL, 
    [Description] [nvarchar](255) NOT NULL 
CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED ([CustomerID] ASC) 

CREATE TABLE [dbo].[Orders](
    [OrderID] [int] IDENTITY(1,1) NOT NULL, 
    [CustomerID] [int] NOT NULL, 
     ... 
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED ([OrderID] ASC) 

ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Customers] 
    FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customers] ([CustomerID]) 

. 이것은 매우 쉽고 재미 있습니다. 사실, 내가 가지고있는 코드는 내가, 또한 테이블 사이의 관계 (1-N 매핑 코드를 작성하는 지금 1-1 싶습니다 다음 샘플

public class Customer { 
    public int CustomerID { get; set; } 
    public string Description { get; set; } 
} 

처럼 각 테이블에 대해 하나의 클래스를 생성 할 수) 그래서이 클래스와 같은 클래스를 얻으려면

public class Customer { 
    public int CustomerID { get; set; } 
    public string Description { get; set; } 
    public IList<Order> Orders { get; set; } 
} 

불행히도 내 코드는 작동하지 않습니다. 여기있다 : 엔티티 세트 이름이 아닌 개체 이름입니다

public class Customer { 
    public int CustomerID { get; set; } 
    public string Description { get; set; } 
    public IList<Orders> Orders { get; set; } // NOTE THE PLURAL IN THE TYPE NAME!!! 
} 

:

foreach (NavigationProperty navProperty in entity.NavigationProperties.Where(p => p.DeclaringType == entity)) { 
    string elementType = ((EntityType)((RefType)navProperty.ToEndMember.TypeUsage.EdmType).ElementType).Name; 
    string relationshipName = navProperty.ToEndMember.DeclaringType.FullName; 
    string targetRoleName = navProperty.ToEndMember.Name; 
    if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { 
     <#=Accessibility.ForProperty(navProperty) #> IList<<#=navProperty.Name#>> <#=navProperty.Name#> { get; set; } 
    } 
} 

불행하게도이이 같은 코드를 생성합니다. 이 문제를 해결하기 위해 내가해야 할 일은 무엇입니까?

참고 : .NET 3.5 버전에는 EF를 사용하고 있습니다. 또한 나는 비주얼 스튜디오에서 EF.Utility.CS.ttinclude 사용할 수를 포함하여 10

답변

1

해결책을 찾았습니다. 올바른 코드는 다음과 같습니다.

foreach (NavigationProperty navProperty in entity.NavigationProperties.Where(p => p.DeclaringType == entity)) { 
    string elementType = ((EntityType)((RefType)navProperty.ToEndMember.TypeUsage.EdmType).ElementType).Name; 
    if (navProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) { 
     <#=Accessibility.ForProperty(navProperty) #> IList<<#= elementType #>> <#=navProperty.Name#> { get; set; } 
    } 
} 
0

대신 목록 선언의 내부

navProperty.name 

를 사용

당신은 내가 생각하는 속성을 통해

navProperty.ToEndMember 

를 사용할 수 있어요 실제 복수형이 아닌 클래스 이름을 찾을 수 있어야합니다.

+0

감사합니다. 맞습니다.하지만 .....'navProperty.ToEndMember.Name'을 사용하면 'Orders'도 얻을 수 있습니다. – Lorenzo

+0

navProperty.ToEndMember.TypeUsage.EdmType.Name – bwbrowning

+0

이것은 무엇을 제공합니까? 다음 엔터티 이름을 포함하지만 더 많은 텍스트로 장식 된 "reference [CitiesModel.Order]"문자열을 따르십시오. – Lorenzo