次のテーブルとリレーションがあるとします。
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 で利用できるものも含めています。