1

私はCode Firstアプローチを使用したプロジェクトを1つ持っておりEF、そこでデータ注釈を使用するのは簡単でした。現在、私は Database First を使用していますが、Data Annotations を使用する方がより具体的であることがわかったので、それを実装するための正しい手順を知りたいと思っています。

データ アクセスを提供する私のプロジェクトの構造は次のとおりです。

データアクセス

エンティティにデータ注釈を追加するために作成したModelExtensionsすべてのファイルがあります。DbContextModel.tt

のファイルの 1 つの構造は次のModelExtensionsとおりです。

using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;

namespace DataAccess.ModelExtensions
{
    [MetadataType(typeof(MCS_ContentTypesMetaData))]
    public partial class MCS_ContentTypes : BaseEntity
    {

    }

    internal sealed class MCS_ContentTypesMetaData
    {
        [Required]
        [StringLength(10)]
        public string Name { get; set; }
    }
}

ここでいくつか質問があります。最初 - 名前空間。namespace DataAccess.ModelExtensionsこのままなのか、部品を外さなければならないのか.ModelExtensions。最初に DB を使用するプロジェクトを見ていましたが、名前空間がDataAccess必要な理由がわかりませんでした (必要な場合)。DbContextModel.ttまた、エンティティに他の参照を追加する必要がありますか? これには標準の C# クラスを使用し、名前を : に変更しますpublic partial class MCS_ContentTypes : BaseEntity。エンティティとこのファイルの間の接続を明示的に公開するために、それらを作成するための特別なアプローチを使用する必要がありますか?

4

1 に答える 1

2

1) 拡張モデルの名前空間は、EF 自動生成エンティティ クラスの名前空間と同じである必要があります。DbContextModel.ttエンティティ クラスの名前空間が の場合、クラスDataAccessの名前空間を に設定する必要がありますDataAccess

2)あなたの質問を完全には理解していませんが、このアプローチでは、エンティティクラスとクラスの名前は同じでなければなりません。

次の例は、それがどうあるべきかを示しています。EF が次のエンティティ クラスを生成するとします。

namespace YourSolution
{
    using System;
    using System.Collections.Generic;

    public partial class News
    {
        public int ID { get; set; }
        public string Title { get; set; }        
    }
}

したがって、部分クラスは次のようになります。

namespace YourSolution
{
    [MetadataType(typeof(NewsAttribs))]
    public partial class News
    {
        // leave it empty.
    }

    public class NewsAttribs
    {            
        // Your attribs will come here.

        [Display(Name = "News title")]
        [Required(ErrorMessage = "Please enter the news title.")]
        public string Title { get; set; }

        // and other properties you want...
    }
}

: BaseEntityしたがって、継承は必要ありません。

于 2013-07-26T02:10:32.010 に答える