0

次のテーブルとリレーションがあるとします。

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 クラスを生成しています。これはとても簡単で、本当に面白いです。実際、私が持っているコードは、次のサンプルのようにテーブルごとに 1 つのクラスを生成できます。

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 で利用できるものも含めています。

4

2 に答える 2

1

Found the solution. This is the correct code:

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; }
    }
}
于 2012-05-28T12:47:48.640 に答える
0

使用する代わりに

navProperty.name

あなたのリスト宣言の中に

使える

navProperty.ToEndMember

そのプロパティを通じて、実際の複数化されていないクラス名を見つけることができるはずだと思います

于 2012-05-17T16:10:27.787 に答える