2012-05-17 23 views
0

假設我有以下表和關係: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]) 

我使用一些T4模板爲每個數據庫列的屬性,以生成簡單的POCO類。這很簡單,很有趣。事實上,我的代碼能夠產生用於每個表中的單個類像以下示例

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

在我現在想也創建映射(1-N的表之間的關係的代碼,1-1 )所以要獲得,例如像這樣的一個類

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

不幸的是我的代碼不起作用。那就是:

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; } 
    } 
} 

很不幸,這產生像這樣的代碼:

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!!! 
} 

這是實體集名稱不是實體名稱。我需要做些什麼來解決這個問題?

注意:我使用的是.NET 3.5版本的EF。我也是其中包括EF.Utility.CS.ttinclude可以在Visual Studio 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',我也得到'訂單':) – Lorenzo

+0

這是什麼給你的:navProperty.ToEndMember.TypeUsage.EdmType.Name – bwbrowning

+0

它返回以下字符串「reference [CitiesModel.Order]」,其中包含正確的實體名稱,但裝飾有更多文本.... – Lorenzo