2

Voici la situation:StoreGeneratedPattern T4 EntityFramework préoccupation

J'utilise SQL Server 2008 R2, la réplication SQL, Visual Studio 2010, EntityFramework 4, C# 4.

Le cours-de-actions de notre DBA est à utilisez une colonne rowguid pour que la réplication SQL fonctionne avec notre configuration. Ces colonnes doivent avoir une propriété StoreGeneratedPattern définie sur Computed sur chacune de ces colonnes.

Le problème:

Chaque fois que le modèle T4 régénèrent notre EDMX fichier (ADO.NET Entity Data Model) (par exemple, lorsque nous mettons à jour de notre base de données), je dois aller manuellement dans le EDMX XML fichier pour ajouter cette propriété à chacun d'eux. Il doit passer de ceci:

<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" /> 

à ceci:

<Property Name="rowguid" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Computed"/> 

La solution:

J'essaie de trouver un moyen de personnaliser un fichier Générateur ADO.NET EntityObject T4 générer un StoreGeneratedPattern = "Computed" à chaque rowguid que j'ai.

Je suis assez nouveau sur T4, j'ai seulement fait de la personnalisation aux modèles AddView et AddController T4 pour ASP.NET MVC 2, comme List.tt par exemple. J'ai regardé à travers le fichier EF T4, et je n'arrive pas à trouver à travers ce monstre où je pourrais faire ça (et comment).

Ma meilleure estimation est quelque part dans cette partie du fichier, la ligne 544-618 du fichier d'origine ADO.NET EntityObject Générateur T4:

//////// 
    //////// Write PrimitiveType Properties. 
    //////// 
    private void WritePrimitiveTypeProperty(EdmProperty primitiveProperty, CodeGenerationTools code) 
    { 
     MetadataTools ef = new MetadataTools(this); 
#> 

    /// <summary> 
    /// <#=SummaryComment(primitiveProperty)#> 
    /// </summary><#=LongDescriptionCommentElement(primitiveProperty, 1)#> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=<#=code.CreateLiteral(ef.IsKey(primitiveProperty))#>, IsNullable=<#=code.CreateLiteral(ef.IsNullable(primitiveProperty))#>)] 
    [DataMemberAttribute()] 
    <#=code.SpaceAfter(NewModifier(primitiveProperty))#><#=Accessibility.ForProperty(primitiveProperty)#> <#=code.Escape(primitiveProperty.TypeUsage)#> <#=code.Escape(primitiveProperty)#> 
    { 
     <#=code.SpaceAfter(Accessibility.ForGetter(primitiveProperty))#>get 
     { 
<#+    if (ef.ClrType(primitiveProperty.TypeUsage) == typeof(byte[])) 
       { 
#> 
      return StructuralObject.GetValidValue(<#=code.FieldName(primitiveProperty)#>); 
<#+ 
       } 
       else 
       { 
#> 
      return <#=code.FieldName(primitiveProperty)#>; 
<#+ 
       } 
#> 
     } 
     <#=code.SpaceAfter(Accessibility.ForSetter((primitiveProperty)))#>set 
     { 
<#+ 
     if (ef.IsKey(primitiveProperty)) 
      { 
       if (ef.ClrType(primitiveProperty.TypeUsage) == typeof(byte[])) 
       { 
#> 
      if (!StructuralObject.BinaryEquals(<#=code.FieldName(primitiveProperty)#>, value)) 
<#+ 
       } 
       else 
       { 
#> 
      if (<#=code.FieldName(primitiveProperty)#> != value) 
<#+ 
       } 
#> 
      { 
<#+ 
     PushIndent(CodeRegion.GetIndent(1)); 
      } 
#> 
      <#=ChangingMethodName(primitiveProperty)#>(value); 
      ReportPropertyChanging("<#=primitiveProperty.Name#>"); 
      <#=code.FieldName(primitiveProperty)#> = StructuralObject.SetValidValue(value<#=OptionalNullableParameterForSetValidValue(primitiveProperty, code)#>); 
      ReportPropertyChanged("<#=primitiveProperty.Name#>"); 
      <#=ChangedMethodName(primitiveProperty)#>(); 
<#+ 
     if (ef.IsKey(primitiveProperty)) 
      { 
     PopIndent(); 
#> 
      } 
<#+ 
      } 
#> 
     } 
    } 
    private <#=code.Escape(primitiveProperty.TypeUsage)#> <#=code.FieldName(primitiveProperty)#><#=code.StringBefore(" = ", code.CreateLiteral(primitiveProperty.DefaultValue))#>; 
    partial void <#=ChangingMethodName(primitiveProperty)#>(<#=code.Escape(primitiveProperty.TypeUsage)#> value); 
    partial void <#=ChangedMethodName(primitiveProperty)#>(); 
<#+ 
    } 

Toute aide serait appréciée. Merci d'avance.

EDIT: N'a pas encore trouvé de réponse à ce problème, si quelqu'un a des idées pour automatiser cela, serait vraiment apprécié.

Répondre

0

Cela clarifiera beaucoup: Known issues with StoreGeneratedPattern

+1

Il assez bien expliquer en détail ce que dois-je faire manuellement à chaque fois. Le point est, je veux automatiser cette étape, je pensais que T4 serait le chemin à parcourir, toujours pas trouvé une meilleure façon de le faire ... Je me sens un peu triste que EF4 ne fonctionne pas très bien avec les clés générées (GUID ou AUTO-INT), espère qu'il y aura une solution pour cela sur la prochaine version d'EF. En attendant, je suis toujours à la recherche d'une solution de contournement automatisée. – LoganWolfer

0

Ce modèle est responsable de la génération du code C#. Cela n'affectera pas la génération XML du modèle.
Essayez de contacter Microsoft sur le problème de régénération du stockage.