Entity framework 为什么使用T4修改EF中的实体?
将“ADO.NET EntityObject Generator”与EF一起使用的有效原因是什么?如果您不知道,它将生成一个T4文件,用于从edmx构建实体。然后,您可以更改T4文件以更改实体的生成方式 我的问题是:除了更改派生实体的基类(也实现接口)和更改实体和/或上下文对象和命名约定的可访问性之外,这还有什么用?考虑EF和部分类的现有特性 我想出了2个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本身
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);
}