2011-06-28 18 views
18

生かし、私は次のキャメルケース規則を使用して、私のSQLデータベースの列に名前を付ける傾向があります。Entity Frameworkのは、最初のプロパティ名の手紙一般的に

しかし、C#ので作業する場合、私は、次の大会での私のオブジェクトのパブリックプロパティの名前が好き:

キャメルケースを(最初はuppwerケースであることに注意してください)。

Entity Frameworkのデフォルトの動作では、作成されたクラスのプロパティに、データベース内の相対カラム名と一致する名前を付けることができます。

この問題を解決するために変更できるプロジェクト/ソリューションレベルのプロパティはありますか?

+0

dbFirst approch rytですか? –

+0

私はADO.NETエンティティデータモデルデザイナ(ダブルクリック.edmxファイル)のテーブルの名前を変更しようとしましたが、そこにテーブルの名前を変更すると、メソッドの名前も変更されます。たとえば、テーブル 'customer'の名前を' Customer'に変更した場合、メソッド 'AddTocustomers' getは' AddToCustomers1'にリネームされます。なぜビジュアルスタジオは1を配置しますか? –

+0

あなたはプロパティ名rytだけを変更する必要がありますか? –

答えて

3

は、私は、ソリューションレベルの知らないが、あなたはあなたが.edmxファイルでそれを変更することができます

[Table("myEntity")] 
public class MyEntity{} 
+0

おかげさまで、私はモデル全体に​​影響を与える何かを探していますが、それは各クラスのプロパティセット全体を調べるのは面倒です。 –

0

エンティティに属性を設定することができます。プロパティ名をクリックしてキャメルケースに名前を変更するだけで、オブジェクトを使用してアクセスしようとするたびに同じ名前が反映されます。

+3

ありがとう、私はモデル全体に​​影響を与える何かを探していますが、それは各クラスのプロパティセット全体を調べるのは面倒です。 –

2

これを達成することは不可能ではありませんが、容易ではありません。その中には、コードファーストまたはデータベース/モデルファースト(これに関しては類似しています)、または古いObjectContextベースのメソッドを使用している場合、どちらのタイプのEFモデルが依存しているかによって異なります。

一般に、EFはT4テンプレートを使用して実際のクラスとモデルを作成します。そのため、T4テンプレートを編集し、PascalCasingでプロパティを自動的に生成するなど、必要なものを生成できます。

コードを最初に使用している場合(最初にコードする必要はありませんが、ひどい名前です)、Entity Frameworkのパワーツールを使用してデータベースをリバースエンジニアリングして最初のモデルをコード化し、 T4を使用してこれを行います。

実際のコードを最初に使用している場合(モデルを作成してモデルからデータベースを生成する場合)、既存のEF5以下では不可能な場合があります。 EF6(現在のアルファ版)には、おそらくこれに使用できるカスタム規約として知られているものがありますが、これはまだ生産品質から離れています。

0

あなたは、「データベースからの更新」ルーチンのdoesntは、このような機能を持っているので、これは、可能イマイチinbuild EDMXのdesingerで http://www.devart.com/entitydeveloper/

などの外部ツールを使用することができます。

0

クラスコードはT4テンプレートから生成されます。あなたの設定によっては、これがあなたのプロジェクトにすでにあるかもしれません。あるいは、EDMXが組み込みのものを使用しているかもしれません。その場合、あなた自身を追加し、EDMXの "コード生成戦略"を "None"プロパティ(モデルブラウザを使用)このファイルからクラスとプロパティ名の生成を見つけて変更するのはかなり簡単です。

デフォルトはでファイルをインクルードで定義されているEscape機能を呼び出しているVisual Studioのフォルダの下を「IDE /拡張機能/マイクロソフト/ Entity Frameworkのツール/テンプレート/インクルード」、そして最終的にはちょうどCreateEscapedIdentifierを呼び出します。文字列の大文字のバージョンでこれを単に呼び出すだけです。

FYI:これらの名前は、データベースから直接ではなく、EDMXで定義されたEntityTypeおよびNavigationPropertyオブジェクトからのものです。 EDMXの「データベースから生成」機能を使用している場合、名前はすでに変換されている可能性があり、元のテーブル名はモデルに保持されません。しかしこれはおそらく問題にはなりません。

1

私はまた、この種の問題を抱えていました。だから私は単に既存のedmxファイルの名前を変更するためのツールをc#で作成し、次にedmxファイルの各セクションの名前を変更した後、T4テンプレートを使用してPocoクラスを再生成します。それは私の問題を解決しました。これは、Camel CaseプロパティでPOCOクラスを生成します。基本的にedmxには3つのレイヤーがあります。だから我々はそれらの2つの層を変更する必要があります。

  • MappingsSection
  • ConceptualModelsSection

それを行うには、以下のクラスを見つけてください。

namespace Edmx_Manager_V1._0 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Xml; 

    public static class RenameManager 
    { 
     public static XmlDocument Document = new XmlDocument(); 
     public static string FilePath; 
     public static XmlNamespaceManager nsmgr; 

     /// <summary> 
     /// Updates the conceptual models section. 
     /// </summary> 
     public static void UpdateConceptualModelsSection() 
     { 

      ///////////////////////update ConceptualModels section////////////////////////////////////////////////////////// 

      XmlNodeList Schema = Document.SelectNodes("/edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/edm:Schema", nsmgr); 

      XmlNode SchemaNode = Schema[0]; 
      XmlElement SchemaNodeXmlElement = SchemaNode as XmlElement; 

      //get all EntitySet nodes under EntityContainer node 
      XmlNodeList EntitySetlist = SchemaNodeXmlElement.GetElementsByTagName("EntitySet"); 

      //get all EntityType nodes under SchemaNode 
      XmlNodeList EntityTypelist = SchemaNodeXmlElement.GetElementsByTagName("EntityType"); 

      foreach (XmlNode EntityTypenode in EntityTypelist) 
      { 

       //to call GetElementsByTagName we need XmlElement object 
       XmlElement EntityTypenodeelement = EntityTypenode as XmlElement; 

       //get all PropertyRef nodes under EntityType node 
       XmlNodeList PropertyReflist = EntityTypenodeelement.GetElementsByTagName("PropertyRef"); 

       foreach (XmlNode PropertyRefnode in PropertyReflist) 
       { 
        //update name attribute of Key/PropertyRef nodes 
        XmlAttribute PropertyRef_nameAttribute = PropertyRefnode.Attributes["Name"]; 
        PropertyRef_nameAttribute.Value = UppercaseFirst(PropertyRef_nameAttribute.Value); 
       } 

       //get all Property nodes under EntityType node 
       XmlNodeList Propertylist = EntityTypenodeelement.GetElementsByTagName("Property"); 

       foreach (XmlNode Propertynode in Propertylist) 
       { 
        //update name attribute of PropertyRef nodes 
        XmlAttribute Property_nameAttribute = Propertynode.Attributes["Name"]; 
        Property_nameAttribute.Value = UppercaseFirst(Property_nameAttribute.Value); 
       } 

       //get all NavigationProperty nodes under EntityType node 
       XmlNodeList NavigationPropertylist = EntityTypenodeelement.GetElementsByTagName("NavigationProperty"); 

       foreach (XmlNode NavigationPropertynode in NavigationPropertylist) 
       { 
        //update name attribute of NavigationProperty nodes 
        XmlAttribute NavigationPropertynode_nameAttribute = NavigationPropertynode.Attributes["Name"]; 
        NavigationPropertynode_nameAttribute.Value = UppercaseFirst(NavigationPropertynode_nameAttribute.Value) + "s";// we append "s" for nav properties 
       } 
      } 

      //get Association node under Schema node 
      XmlNodeList Associationlist = SchemaNodeXmlElement.GetElementsByTagName("Association"); 

      //get all Association nodes and process 
      foreach (XmlNode AssociationNode in Associationlist) 
      { 
       if (AssociationNode != null) 
       { 
        XmlElement AssociationNodeXmlElement = AssociationNode as XmlElement; 
        //get all end nodes under Association 
        XmlNodeList EndNodelist2 = AssociationNodeXmlElement.GetElementsByTagName("End"); 

        //get all PropertyRef nodes under Association 
        XmlNodeList PropertyReflist2 = AssociationNodeXmlElement.GetElementsByTagName("PropertyRef"); 

        foreach (XmlNode PropertyRefNode2 in PropertyReflist2) 
        { 
         //update Type attribute 
         XmlAttribute PropertyRefNode2Attribute = PropertyRefNode2.Attributes["Name"]; 
         PropertyRefNode2Attribute.Value = UppercaseFirst(PropertyRefNode2Attribute.Value); 
        } 
       } 
      } 

      Console.WriteLine("ConceptualModelSection updated.."); 
     } 

     /// <summary> 
     /// Updates the mappings section. 
     /// </summary> 
     public static void UpdateMappingsSection() 
     { 

      ///////////////////////update edmx:Mappings section////////////////////////////////////////////////////////// 

      XmlNodeList EntityContainerMapping = Document.SelectNodes("/edmx:Edmx/edmx:Runtime/edmx:Mappings/cs:Mapping", nsmgr); 
      XmlNode EntityContainerMapping_Node = EntityContainerMapping[0]; 
      XmlElement EntityContainerMappingNode_XmlElement = EntityContainerMapping_Node as XmlElement; 

      // update name attribute of all EntitySetMapping nodes 

      //get all EntitySetMapping nodes 
      XmlNodeList EntitySetMappinglist = EntityContainerMappingNode_XmlElement.GetElementsByTagName("EntitySetMapping"); 

      //get all EntityTypeMapping nodes 
      XmlNodeList EntityTypeMappinglist = EntityContainerMappingNode_XmlElement.GetElementsByTagName("EntityTypeMapping"); 

      //get all ScalarProperty nodes 
      XmlNodeList ScalarPropertyist = EntityContainerMappingNode_XmlElement.GetElementsByTagName("ScalarProperty"); 

      foreach (XmlNode ScalarPropertyNode in ScalarPropertyist) 
      { 
       XmlAttribute nameAttribute = ScalarPropertyNode.Attributes["Name"]; 
       nameAttribute.Value = UppercaseFirst(nameAttribute.Value); 
      } 

      Console.WriteLine("MappingSection updated.."); 
     } 

     /// <summary> 
     /// Uppercases the first. 
     /// </summary> 
     /// <param name="name">The name.</param> 
     /// <returns></returns> 
     private static string UppercaseFirst(string name) 
     { 

      return char.ToUpper(name[0]) + name.Substring(1); 

     } 
    } 
} 

用途:

  RenameManager.FilePath = @"C:\Users\therath\testApp\Model1.edmx"; 
      // Path of edmx file in the your solution 
      RenameManager.Document.Load(@RenameManager.FilePath); 
      RenameManager.nsmgr = new XmlNamespaceManager(RenameManager.Document.NameTable); 
      RenameManager.nsmgr.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx"); 
      RenameManager.nsmgr.AddNamespace("edm", "http://schemas.microsoft.com/ado/2008/09/edm"); 
      //nsmgr.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl"); 
      RenameManager.nsmgr.AddNamespace("cs", "http://schemas.microsoft.com/ado/2008/09/mapping/cs"); 

      try 
      { 
       RenameManager.UpdateConceptualModelsSection(); 
       RenameManager.UpdateMappingsSection(); 
       RenameManager.Document.Save(@RenameManager.FilePath); 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message.ToString()); 
      } 

再度EDMXを生成する場合は、もう一度このツールを実行する必要があるかもしれません。

1

は、私はそれを行う1つのクラスを見つけ

...それを行うための方法、すでに他の人によって指摘されているいくつかのがある...明示的な

namespace System.Data.Entity.ModelConfiguration.Conventions 
{ 
    /// <summary> 
/// Convention to convert any data types that were explicitly specified, via data  annotations or <see cref="T:System.Data.Entity.DbModelBuilder"/> API, 
///     to be lower case. The default SqlClient provider is case sensitive and requires data types to be lower case. This convention 
///     allows the <see cref="T:System.ComponentModel.DataAnnotations.ColumnAttrbiute"/> and <see cref="T:System.Data.Entity.DbModelBuilder"/> API to be case insensitive. 
/// 
/// </summary> 
public sealed class ColumnTypeCasingConvention : IDbConvention<DbTableColumnMetadata>, IConvention 
{ 
    internal ColumnTypeCasingConvention() 
{ 
} 

[SuppressMessage("Microsoft.Globalization", "CA1308:NormalizeStringsToUppercase")] 
void IDbConvention<DbTableColumnMetadata>.Apply(DbTableColumnMetadata tableColumn, DbDatabaseMetadata database) 
{ 
    if (string.IsNullOrWhiteSpace(tableColumn.TypeName)) 
    return; 
    tableColumn.TypeName = tableColumn.TypeName.ToLowerInvariant(); 
} 

} }

idbconvertionの実装で実装できることはありますか

もう1つは

です3210

3つのファイルdb.csdl、db.msl、db.ssdl 編集MSLファイルがある/

をedmxresourcestoembed =>あなたは「のような各テーブルのマッピングを参照してくださいでしょ=ソリューションに行く>フォルダOBJ /デバッグを見つけます以下の通りです。

0

実際にedmxの名前を編集することはできますが、データベースから更新するたびに、もう一度やり直すことに戻ります。

edmxタイプのデータ型を使用するときに実行可能な唯一のアプローチは、データベースのテーブルに正しい名前(大文字)を入れることです。そうしなければ面倒です。

代わりにsqlへのリンクを使用することができます。この場合、データクラスを定義し、nameプロパティを指定するだけです。しかし、クリック、クリック、次のアプローチであるedmx自動生成を設定するには、もっと多くの思考が必要なため、このアプローチはかなり手作業であり、ほとんどの場所を中断していることに注意してください。

だから、あなたはedmxの名前を編集することができますが、代わりにテーブルのcamelCasingを放棄することを検討してください。hommage to edmxはあなたの仕事を大変に費やしてしまいます。あるいは、.net自動生成されたプロキシクラスは、あなたが知っているように。

12

はいあります。ここでは完全な例を見ることができます:

using System; 
using System.Data.Entity; 

namespace ConsoleApplication1 
{ 
    class MyDbContext : DbContext 
    { 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      modelBuilder.Properties().Configure(c => 
      { 
       var name = c.ClrPropertyInfo.Name; 
       var newName = char.ToLower(name[0]) + name.Substring(1); 
       c.HasColumnName(newName); 
      }); 
     } 

     public MyDbCondenxt(string cs) : base(cs) 
     { 

     } 

     public DbSet<MyModel> MyModels { get; set; } 

    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var context = new MyDbContext ("DefaultConnection"); 
      context.MyModels.Add(new MyModel{SomeText = "hello"}); 
      context.SaveChanges(); 

      Console.ReadLine(); 
     } 
    } 

    class MyModel 
    { 
     public int Id { get; set; } 
     public string SomeText { get; set; } 
    } 


} 

プロパティ名は「SomeText」で、列名は「someText」です。

+0

私はEF Core 2.0.0を使用しており、 'modelBuilder.Properties()'は存在しないようです。 EFコアのための他のソリューションはありますか? – Poulad

+0

私の答えはここにあります:https://github.com/aspnet/EntityFrameworkCore/issues/5159#issuecomment-256300665 – Poulad