Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework T4关系生成_Entity Framework_Code Generation_T4 - Fatal编程技术网

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]”,该字符串包含正确的实体名称,但用更多的文本修饰。。。。