あなたはあなたが求めていることをかなり簡単に達成することができます。ダリンには非常に有効な点があり、大規模なプロジェクトにも当てはまりますが、小規模なプロジェクトではやり過ぎのように思えます。また、検証にDataAnnotationsを使用しているか、サードパーティのライブラリを使用しているかに大きく依存しているようです。これを行わないことに伴う繰り返しは、かなりのメンテナンスの妨害になります、IMHO。DBからビューモデルにデータをコピーするだけで多くのコード行を費やすという事実もあります。ORMはそれを排除するのに役立つはずですが、これまでのところ、解決策はあまり良くないようです。
これは、あなたが望むことを行う方法に関するコードの抜粋の例です。最初のクラスは部分的であり、本体はEFで生成されたコードに含まれています(コードを最初にではなく、モデルを最初に使用します)。また、例として、QuestionにはQuestionGroupへのFKがあります。DBではこれはGroupIDという名前の列ですが、ViewModelには素敵な小さなグリッドに表示するためのGroupNameという名前のプロパティがあります(実際には、EFオブジェクトを渡そうとすると基本的に壊れます)。
[MetadataType(typeof(QuestionMetadata))]
public partial class Question
{
}
public class QuestionMetadata
{
public Int32 ID { get; set; }
[Required]
[Display(Name="Question")]
public String QuestionText { get; set; }
[Display(Name = "Order")]
public Int16 SortOrder { get; set; }
}
[MetadataType(typeof(QuestionMetadata))]
public class QuestionViewModel
{
/* Fields found in the original model */
public Int32 ID { get; set; }
public String QuestionText { get; set; }
public Int16 SortOrder { get; set; }
/* Fields that map child object data for this view model */
[Display(Name = "Question Group")]
public String GroupName { get; set; }
}
私見では、EFとTelerikの両方が、ここではあまり乾燥しないように強制していますが、私にできることは何もありません。EFは、デフォルトでこれらのDataAnnotationsを生成する必要があります(または少なくともオプションがあります)。これは、必要なフィールド(nullではない)またはさまざまな文字列の最大長が明らかにわかっているためです。次に、TelerikはViewModelを作成するように強制しますが、これも苦痛です。