假设我有以下表格和关系:
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。此外,我还包括Visual 10中提供的EF.Utility.CS.ttinclude。
发布于 2012-05-28 12:47:48
找到了解决办法。这是正确的代码:
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-17 16:10:27
而不是使用
navProperty.name在您的列表声明中
你能用
navProperty.ToEndMember通过这个属性,我认为您应该能够找到真正的非多元类名。
https://stackoverflow.com/questions/10638031
复制相似问题