Entity framework 为什么使用T4修改EF中的实体?

Entity framework 为什么使用T4修改EF中的实体?,entity-framework,entity-framework-4,t4,Entity Framework,Entity Framework 4,T4,将“ADO.NET EntityObject Generator”与EF一起使用的有效原因是什么?如果您不知道,它将生成一个T4文件,用于从edmx构建实体。然后,您可以更改T4文件以更改实体的生成方式 我的问题是:除了更改派生实体的基类(也实现接口)和更改实体和/或上下文对象和命名约定的可访问性之外,这还有什么用?考虑EF和部分类的现有特性 我想出了2个 从数据库中获取表/列描述,并填充实体和属性的摘要 生成灯光wieght DTO并进行自动映射 考虑到它只更新模型上的注释,而不是edmx本身

将“ADO.NET EntityObject Generator”与EF一起使用的有效原因是什么?如果您不知道,它将生成一个T4文件,用于从edmx构建实体。然后,您可以更改T4文件以更改实体的生成方式

我的问题是:除了更改派生实体的基类(也实现接口)和更改实体和/或上下文对象和命名约定的可访问性之外,这还有什么用?考虑EF和部分类的现有特性

我想出了2个

  • 从数据库中获取表/列描述,并填充实体和属性的摘要
  • 生成灯光wieght DTO并进行自动映射
  • 考虑到它只更新模型上的注释,而不是edmx本身(尽管它可以这样做),1似乎做了太多的工作


    2这有用吗?

    我们已经用T4模板做了一些事情。第一种方法是将生成的代码拆分为每个文件一个类,而不是一个大文件。这使得在实体中导航和浏览更加容易

    第二个,也是更重要的一个,是自动生成数据注释验证属性,如StringLength和Required。这使我们可以通过单个函数调用验证实体,并确保它们的验证属性始终与数据库同步(例如,如果我们更改数据库中的列长度,则生成的StringLength()属性将在执行“从数据库更新模型”时更新)

    在之前的工作中,我们还向实体添加了基类和接口,正如您在问题中提到的


    下面是T4模板中的一个片段,用于检查所需的列和字符串长度,并添加必要的验证属性:

        ''' <summary>
        ''' <#=SummaryComment(primitiveProperty)#>
        ''' </summary><#=LongDescriptionCommentElement(primitiveProperty, 1)#>
        <EdmScalarPropertyAttribute(EntityKeyProperty:=<#=code.CreateLiteral(ef.IsKey(primitiveProperty))#>, IsNullable:=<#=code.CreateLiteral(ef.IsNullable(primitiveProperty))#>)>
        <DataMemberAttribute()>
    <#+
      ' begin required attribute
      If Not ef.IsNullable(primitiveProperty) and not ef.IsKey(primitiveProperty) then
    #>
    <#+
        If ef.ClrType(primitiveProperty.TypeUsage) = GetType(Guid) Then
    #>
        <GuidRequiredAttribute(ErrorMessage:="<#=FixName(code.Escape(primitiveProperty))#> is required")>
    <#+
        Else
    #>
        <RequiredAttribute(ErrorMessage:="<#=FixName(code.Escape(primitiveProperty))#> is required")>
    <#+
        End If
    #>
    <#+
      End If
        If HasMaxLength(primitiveProperty.TypeUsage) then
        Dim d = MaxLength(primitiveProperty.TypeUsage)
    #>
        <StringLengthAttribute(<#=d#>, ErrorMessage:="<#=FixName(code.Escape(primitiveProperty))#> cannot be longer than <#=d#> characters")>
    <#+
        End If
    #>
    
    “”
    ''' 
    ''' 
    
    我们已经用T4模板做了一些事情。第一种方法是将生成的代码拆分为每个文件一个类,而不是一个大文件。这使得在实体中导航和浏览更加容易

    第二个,也是更重要的一个,是自动生成数据注释验证属性,如StringLength和Required。这使我们可以通过单个函数调用验证实体,并确保它们的验证属性始终与数据库同步(例如,如果我们更改数据库中的列长度,则生成的StringLength()属性将在执行“从数据库更新模型”时更新)

    在之前的工作中,我们还向实体添加了基类和接口,正如您在问题中提到的


    下面是T4模板中的一个片段,用于检查所需的列和字符串长度,并添加必要的验证属性:

        ''' <summary>
        ''' <#=SummaryComment(primitiveProperty)#>
        ''' </summary><#=LongDescriptionCommentElement(primitiveProperty, 1)#>
        <EdmScalarPropertyAttribute(EntityKeyProperty:=<#=code.CreateLiteral(ef.IsKey(primitiveProperty))#>, IsNullable:=<#=code.CreateLiteral(ef.IsNullable(primitiveProperty))#>)>
        <DataMemberAttribute()>
    <#+
      ' begin required attribute
      If Not ef.IsNullable(primitiveProperty) and not ef.IsKey(primitiveProperty) then
    #>
    <#+
        If ef.ClrType(primitiveProperty.TypeUsage) = GetType(Guid) Then
    #>
        <GuidRequiredAttribute(ErrorMessage:="<#=FixName(code.Escape(primitiveProperty))#> is required")>
    <#+
        Else
    #>
        <RequiredAttribute(ErrorMessage:="<#=FixName(code.Escape(primitiveProperty))#> is required")>
    <#+
        End If
    #>
    <#+
      End If
        If HasMaxLength(primitiveProperty.TypeUsage) then
        Dim d = MaxLength(primitiveProperty.TypeUsage)
    #>
        <StringLengthAttribute(<#=d#>, ErrorMessage:="<#=FixName(code.Escape(primitiveProperty))#> cannot be longer than <#=d#> characters")>
    <#+
        End If
    #>
    
    “”
    ''' 
    ''' 
    
    嗯,原因是你可以用它做任何事。那么,为什么不买呢?当然,T4的使用仅限于某些特殊情况,大多数情况下使用它没有意义。另一方面,你可以用它做一些时髦的事情。例如,您可以定义一些用户定义的内容。假设您的表中有一个
    Sort
    列。然后,您可以定义一个查询函数,如果该列存在,它会自动对每个条目进行排序。对于一个例子来说,可能太琐碎了,但是有很多其他奇怪的体系结构使它更有意义


    您还可以使用其他代码生成工具,而无需EF。因此,它肯定是为了完整性和可扩展性而出现的。

    好吧,原因是你可以用它做任何事情。那么,为什么不买呢?当然,T4的使用仅限于某些特殊情况,大多数情况下使用它没有意义。另一方面,你可以用它做一些时髦的事情。例如,您可以定义一些用户定义的内容。假设您的表中有一个
    Sort
    列。然后,您可以定义一个查询函数,如果该列存在,它会自动对每个条目进行排序。对于一个例子来说,可能太琐碎了,但是有很多其他奇怪的体系结构使它更有意义


    您还可以使用其他代码生成工具,而无需EF。因此,这里当然是为了完整性和可扩展性。

    T4模板取代了EFv1中用于生成代码隐藏文件(.designer.cs文件和所有类)的自定义工具。T4的主要优点是,只需修改text.tt文件,就可以对每个项目进行更改。在定制工具的情况下,更改几乎是不可能的

    使用T4,您可以完全控制从EDMX生成的实体类。它是将EDMX转换为C#或VB.NET文件。默认模板创建具有大多数开发人员所需功能的类文件,但如果您还需要其他功能,只需转到.tt文件并添加即可


    更改的可能性是无限的,因为EDMX文件本身是可扩展的。EDMX后面就是XML文件,您可以在该文件中包含您自己的自定义XML元素(它有一些限制,但也是可能的——这是模型优先方法中SQL生成的一些示例)。一旦在EDMX中有了自定义元素,您就可以在T4模板中使用它们作为要包含在生成代码中的其他功能的决策逻辑。实体设计器也是可扩展的-您可以创建自定义扩展名,这些扩展名将作为自定义元素存储在EDMX文件中。书中对EDMX和实体设计器扩展都进行了很好的描述。

    T4模板替换了EFv1中用于生成代码隐藏文件(.designer.cs文件和所有类)的自定义工具。T4的主要优点是,只需修改text.tt文件,就可以对每个项目进行更改。在定制工具的情况下,更改几乎是不可能的

    使用T4,您可以完全控制从EDMX生成的实体类。它是将EDMX转换为C#或VB.NET fil
    procedure TDtoDESPATCH.SetSCT_STATUS(const value : string);
    begin
        if (self.IsLoaded) and (inherited SCT_STATUS <> value) then
          begin
            TrackChange('SCT_STATUS');
            self.Modified:= True;
          end;
        inherited SCT_STATUS := value;
    end;
    
    // convert to entity
    var _entity = _dto.ToEntity();
    if(exists)
    {
        Global.LogActivity(string.Format("{0} - profile {1}, updating DESPATCH: {2}", racID, profile, _dto.ChangedProperties ));
        // Attach the entity to the db
        db.DESPATCHes.Attach(_entity);
        // Change tracking
        ChangeTracking<DESPATCH>(_dto.ModifiedProperties, db, _entity);
    }