8

シナリオ: レポート生成を処理するプログラムを作成しています。

レポートをデータベースに保存し、EF モデルにマップしています。いくつかの非データベース フィールドがあります (つまり、一部のフィールドは、データベース内の他のフィールドに基づいて自動計算されます)。DB にのみマップする 1 つのクラスと、その情報を取得し、さらに他の計算フィールドを持つ別のクラスを用意することは理にかなっていますか?

つまり、codefirst データベースと対話するサンプル クラスは次のようになります。

public class Report{
    public int CategoryOneSeverity {get; set;}
    public int CategoryTwoSeverity {get;set;}
    public string Title {get;set;}
}

次のような別のクラスを作成することは理にかなっていますか?

public class ReportModel{
    public int CategoryOneSeverity;
    public int CategoryTwoSeverity;
    public string Title;

    public int RiskRating{
        get{ return CategoryOneSeverity + CategoryTwoSeverity; }
    }
}    

または、RiskRating プロパティを EF モデルに含める必要があります。

4

3 に答える 3

8

はい、ドメインをモデル化するには、DB とは異なるクラスが必要だと絶対に信じています。アプリケーションが非常に単純でない限り、ドメイン オブジェクトを直接マップしようとすると、必要なデータ構造に一致するように変更する必要があり、公開したくないものを公開する可能性があります。これは、単一責任の原則に違反していると考えてください。クラスをドメイン オブジェクトにして直接マップする場合、クラスを変更する理由が 2 つあります。1 つはビジネス要件の変化に対応するもので、もう 1 つはデータ ストレージ スキーマの変化に対応するものです。

于 2013-05-17T16:57:52.530 に答える
7

「DBにのみマッピングするクラスと、その情報を取得し、さらに他の計算フィールドを持つ別のクラスを持つことは理にかなっていますか?」

ほとんどの場合、はい。通常、エンティティ クラスが HumanResourcesReport の場合、HumanResourcesReportViewModel などの「ViewModel」という接尾辞が付いた新しいクラスを作成します。

ViewModel の使用方法にはさまざまなバリエーションがあり、用語については辛辣な議論に入ることができますが、概念的には、エンティティを取得し、そのデータとレポートを処理するために必要な追加情報を使用して新しいクラスを作成します。この場合、レポートの生成はある意味で MVC モデルのビューなので、データを保持するクラスをビューモデルと呼んでも問題ないと思います。

于 2013-05-17T16:47:24.633 に答える
4

Code First または DB First を使用していますか?

データベースのフィールドにマップされていない自動計算フィールドをモデルに含めることができます。

また、アーキテクチャにも依存します。最初に DB を使用している場合、EF モデルを更新すると EF クラスが更新され、マップされたフィールドが失われます。DB-First シナリオでは、代わりに EF モデル クラスを基本クラスとして使用し、それをレポート クラスに継承することもできます。

public class ReportModel
{
    public int CategoryOneSeverity;
    public int CategoryTwoSeverity;
    public string Title;
}   

public class ReportClass : ReportModel
{
    public int RiskRating
    { 
        get { return CategoryOneSeverity + CategoryTwoSeverity; }
    }
}
于 2013-05-17T16:54:13.623 に答える