Entity framework T4关系生成
假设我有以下表格和关系:Entity framework T4关系生成,entity-framework,code-generation,t4,Entity Framework,Code Generation,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] [
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; }
}
公共类客户{
public int CustomerID{get;set;}
公共字符串说明{get;set;}
公共IList命令{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; }
}
}
foreach(实体.NavigationProperties.Where中的NavigationProperty(p=>p.DeclaringType==entity)){
字符串elementType=((EntityType)((RefType)navProperty.ToEndMember.TypeUsage.EdmType).elementType).Name;
string relationshipName=navProperty.ToEndMember.DeclaringType.FullName;
字符串targetRoleName=navProperty.ToEndMember.Name;
if(navProperty.ToEndMember.RelationshipMultiplicity==RelationshipMultiplicity.Many){
IList{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!!!
}
公共类客户{
public int CustomerID{get;set;}
公共字符串说明{get;set;}
公共IList命令{get;set;}//注意类型名称中的复数形式!!!
}
这是实体集名称,而不是实体名称。我要怎么做才能解决这个问题
注意:我将EF用于.NET 3.5版本。此外,我还包括了Visual Studio 10中提供的EF.Utility.CS.t目录。而不是使用
navProperty.name
在你的清单声明里面
你能用吗
navProperty.ToEndMember
通过该属性,我认为您应该能够找到真正的非复数类名,从而找到解决方案。这是正确的代码:
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; }
}
}
foreach(实体.NavigationProperties.Where中的NavigationProperty(p=>p.DeclaringType==entity)){
字符串elementType=((EntityType)((RefType)navProperty.ToEndMember.TypeUsage.EdmType).elementType).Name;
if(navProperty.ToEndMember.RelationshipMultiplicity==RelationshipMultiplicity.Many){
IList{get;set;}
}
}
谢谢您的回答。你说得对,但是。。。。。如果我使用navProperty.ToEndMember.Name
我也会得到'Orders':)这会给你什么:navProperty.ToEndMember.TypeUsage.EdmType.Name它返回以下字符串“reference[CitiesModel.Order]”,该字符串包含正确的实体名称,但用更多的文本修饰。。。。