私は自家製のORMシステムをEntity Framework 4で置き換えたり補完したりすることを検討しています。私は、プログラミングコードの命名規則と定義したものの間に矛盾が生じることに気付いています。データベース。マイクロソフトのショップであるため、メンバー、名前空間などにパスケーシングを使用すると言われているMicrosoft's naming guidelines for our codeに従うことを主に決めました。アンダースコアの使用を避けるなどです。EF4のエンティティとデータベース標準の間の命名規則の競合の解決?
EF4のデフォルトのエンティティ命名規則は、驚くことではないが、これらの標準でうまく機能します。たとえば、SalesOrderというエンティティは、SalesOrderという名前のクラスと、SalesOrdersという名前のエンティティセットを生成します。 EF4モデル - ファーストデザインは、デフォルトでエンティティセットと同じ名前のテーブルを生成します(この例では、生成されたテーブル名はSalesOrdersです)。しかし、データベース標準では、単語間に小文字とアンダースコアを使用することを推奨しています(例:sales_orders)。したがって、Entity Frameworkを「そのまま」使用すると、私たちはそれらから逸脱し始めます。
エンティティ・セット名をSQLテーブル名として使用する動作をオーバーライドすることができるEntity Frameworkはどこにありますか?生成されたSQLスクリプトの代替テーブル名を指定する明白な場所を見つけることができないようです。 EF4を使用して前進する場合、データベース命名規則を再考する唯一のもっともらしい解決策はありますか?
更新:
私は以下のラディスラフのソリューションをしようとしているが、私はは私のカスタムユーティリティを認識するようにEntity Frameworkのモデルデザイナーでモデルオプションからデータベースを生成ように見えることはできません。
%VSINSTALLDIR%\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\Templates\Includes
それは基本的に次のようになります:
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>
public class CustomUtilities
{
public static string EntityNameToSqlName(string name)
{
string sqlName = ""; // The table name based on the input model name
string pattern = "([A-Z]+[s])|([A-Z](?=[a-z]))|((?<=[a-z])[A-Z])"; //Pattern for the regex exp. below
// Separate out each word with spaces:
sqlName = System.Text.RegularExpressions.Regex.Replace(name, pattern, " $&");
// Replace spaces with underscores and then make lowercase:
sqlName = sqlName.Trim().Replace(" ", "_").ToLower();
return sqlName;
}
}
私は私の中でこのファイルを参照しようとした私は、フォルダにMyOrg.EF.Utility.CS.ttincludeという名前のファイルを持っています以下のようなトップの近くにカスタム.ttのDDL生成ファイル:
<#@ include file="MyOrg.EF.Utility.CS.ttinclude"#>
しかし、私は、.ttファイルに次のようなコードを使用して上記の関数を参照しようとした場合:
string tableName = CustomUtilities.EntityNameToSqlName(Id(entitySet.GetTableName()));
のVisual Studioは、名 'CustomUtilities' は現在のコンテキストに存在しないと文句を言い。 "CustomUtilities.EntityNameToSqlName"からクラス名を削除すると、同様のエラーが返されます。カスタム関数をDDL生成コードに挿入する別の方法を試すべきでしょうか?
最終的な解決策:
私は私MyOrg.EF.Utility.CSでのC#コードをラップしていないことに気づいた後、私は最終的にこの作業を取得することができました。これでttincludeファイル:
<#+
[my code]
#>
私もWriteColumns(のパブリックコピーを追加するために必要な)それは私のEntityNametoSqlName()メソッドを使用するようにファイルGenerateTSQL.Utilityで見つけ方法。私はそこにかなりの数のアイテムを中心にCustomUtilities.EntityNameToSqlName()をラップする必要があるため
残念ながら、オリジナルのSSDLToSQL10.ttファイルの私のカスタマイズされたバージョンは、今少し厄介です。
これまでのところ私の最大の賭けと思われますが、辛いほど複雑です。 ** SSDLToSQL10.tt **ファイルのクローンをセットアップし、すべてのテーブル名を小文字にするために少し微調整しました。この新しいDDL生成テンプレートを使用して、自分のエンティティモデルのテーブルを生成することができました。その後、** [My Organization's Name] .EF.Utility.CSという名前のカスタムインクルードファイルを作成しました。ttinclude ** '%VSINSTALLDIR%\ Common7 \ IDE \ Extensions \ Microsoft \ Entity Framework Tools \ Templates \ Includes' しかし、私は上記の主な機能を参照することができないようです.ttファイル。 – Derek
私の更新は、カスタムDDL生成テンプレートを使って試したことがあります。 – Derek
ああ!私はそれが働いていた - 私は '<# >'と012の状態コードでC#コードを忘れていた – Derek