2017-01-25 8 views
0

私はデータベースの最初のアプローチとSQL Serverデータベースを持つプロジェクトを持っています。テーブルのいずれかでエンティティの文字列がNULLの場合、SQLのデフォルト値を使用します。

私は空の文字列として、デフォルト値とNULL可能でない列を持っています。ここ

[Comments] NVARCHAR(1024) NOT NULL DEFAULT ('') 

デフォルト値は常に完全ODATAをサポートするために、空の文字列でなければなりませんそれ以外の場合はどのフィルタ「空ではありません」ビジネスの観点からは空の値を持つレコードを返します。

public string Comments { get; set; } 

今何が起こるかです::適切な入力データで満たされていないと、この値がマップされる場合、私はnull値を得ることができますフロントエンドから私もこの列の文字列プロパティを持っている私のモデルでは

EFによって挿入されるエンティティに挿入されます。

SQL側でデフォルト値を取得するのではなく、nullの「コメント」プロパティでレコードを設定しようとすると例外が発生します。

この列のStoreGeneratedPatternをEDMXのComputedに設定して修正しようとしました。今ではnullを持つレコードを挿入することができ、デフォルト値を取得しますが、エンティティに値がある場合でも毎回取得します。

換言すれば、計算されたStoreGeneratedPatternは、エンティティ内のこのプロパティの値を常に無視し、StoreGeneratedPatternを無効にすると、基本的にはSQL側にデフォルト値はありません。

私が欲しいのは、バックエンドでこの問題を解決することです。

  1. フロントエンドから空の文字列を送信し、このプロパティがnullでないというバックエンドに検証を追加するだけでは解決したくありません。それは私が他のクライアント(モバイルクライアントなど)と同じ状況を満たすすべてのフォームとテーブルに対して同じことを強制します。

  2. 私はちょうどのような何かをすることによってそれを解決したくない:バックエンドで

    entity.Comments = entity.Comments ?? string.empty; 
    

    を。私がこれと他の同様のエンティティを処理するすべての場所でそれを実行するように強制します。

  3. 類似のエンティティのインターフェイスを使用するか、コンストラクタでこのプロパティを初期化することで、この問題を解決したくありません。私はデカップリングの理由からEDMXから私のためのエンティティモデルを構築する1つのT4テンプレートを持っているので、すべてのモデルは自動生成され、決してカスタマイズするべきではありません。

次のように私は私が到達したいと思い期待してたの挙動は以下のとおりです。

EFは、この列にNULL値を持つレコードを挿入しようとする場合は、SQL ServerはDEFAULTを使用し、それ以外の場合は挿入し、エンティティが持っていたもの。

いずれのアイデアや解決策も大歓迎です。

+0

エンティティコンストラクタで空の文字列に設定します。 – DavidG

+0

c#では、エンティティコンストラクタまたはプロパティ初期化子を使用してプロパティの値のデフォルトを設定できます。 DbContextまたはObjectContextにオーバーライドを作成して、永続化されている文字列プロパティ(属性でフィルタすることもできます)に対する変更を、空の文字列に設定することもできます。または、データベースで空の文字列がnullの場合、値を変更するトリガーを作成できます。 ODataを気にする理由がわかりません.ODataは空の比較をうまく処理する必要があります。空の文字列がある場合、値をnullに設定する方が良いでしょう。 – Igor

+0

@Igor ODataQueryOptions をODataQueryOptions に変換しています。内部はオートマッパーと式マッピングを使用しています。基本的に "空ではない"フィルタはSQLクエリで終了します; where columnname!= '';空の文字列でこのプロパティを直接初期化するだけでは、多くの要因による解決策ではありません。しかし私はあなたのアイデアがトリガーで好きです。私はそれを試してみよう! –

答えて

0

私は

private T SetNullStringToDefault<T>(T entity, string default) 
{ 
    List<PropertyInfo> properties = entity.GetType().GetProperties().ToList(); 
    foreach(var property in properties) 
    { 
     //if property is string 
     if(property.PropertyType == typeof(string)) 
     { 
      string value = property.GetValue(entity, null) as string; 
      if (string.IsNullOrEmpty(value)) 
       property.SetValue(entity, default, null); 
     } 
    } 
    return entity; 
} 

私のCRUD機能でこのようなタスクのために使用し、ちょうど

your_object = SetNullStringToDefault<EntityType>(your_object, "Default Value"); 

のようなあなたのインサートが、ちょうどあなたのオブジェクトを渡す前に、それを呼び出す一般的な機能を持っている、それはすべてを変換しますNULL文字列のプロパティをデフォルト値に設定します。

+0

ありがとうございますが、このアプローチでは、NULL値をnullとして取得するカラムが値として取得される場合に使用されるデフォルト値を定義できるようにするSQLレイヤーを完全に無視します。私の最初のアイデアは、DBの最初のアプローチがあるので、バックエンドのデフォルト値を設定しないようにすることでした。すべてのモデルをDBで完全に構成したいと思います。 また、いくつかの拡張メソッドを呼び出すには、必要なすべての場所で呼び出すことを忘れないでください。巨大なエンタープライズプロジェクト(私の場合)では、開発者のエラーの可能性を最小限に抑えるべきベストプラクティスではありません。 –

関連する問題