1

それぞれ数百行の長さのレガシー SQL ステートメントが数十個与えられました。Models各 SQL は、共有プロジェクト内の独自の一意の POCO を持つコードにマップされます。

たとえば、SQLには、プロジェクトSelect Name, Birthday From Peopleに同等の POCO があります。Models

public class BirthdayPerson : SqlResultBase {
    public string Name { get; set; }
    public datetime Birthday { get; set; }

    //SqlResultBase abstraction:
    public string HardcodedSql { get {
        return "Select Name, Birthday From People";
    }}
}

私の DAL には、SQL の POCO を表す単一の汎用 SQL ランナーがあります。<T>したがって、私のビジネスロジックは次のように呼び出すことができますGetSqlResult<BirthdayPerson>():

public IEnumerable<T> GetSqlResult<T>() where T : SqlResultBase, new() {
    return context.Database.SqlQuery<T>((new T()).HardcodedSql);
}

問題は、私のModelsライブラリがアプリケーション全体で使用されており、その HardcodedSql プロパティでアプリケーション全体に SQL を公開したくないことです。

これは私が使用しているアーキテクチャです:

スアメールのドメイン

4

3 に答える 3

1

この質問に対処するためのおそらく 2 つの方法を提案します。

最初の方法については、SQL へのアクセス方法を変更し、呼び出しをメソッドでローカルにラップします。したがって、クラスには public IEnumerable GetFromSql() という関数が含まれている可能性があり、コンテキストで渡すか、新しいコンテキストを作成できます。プロジェクトで EF をどのようにセットアップしたかわかりません。この方法では、生のSQLを公開することはありません.おそらくそれをプライベート変数またはローカル定数にして、関数内からアクセスするだけです.

2番目のオプションとして、実際にこれを行ったところ、すべてのSQLをビューに移動し、EFを使用してそれらにアクセスしました。そうすれば、コードにSQL汚染はありませんでした。モデルが既に存在することを確認すると、ビューを呼び出した結果は、既に持っている型と一致します。

于 2014-11-10T17:36:07.647 に答える