1

そのため、私はMVCを初めて使用し、現在MVC3とEntityFrameworkを使用しています。データベースがすでに存在するため、現在、モデル/スキーマの最初のアプローチを使用しています。したがって、ADO.NETエンティティデータモデル(.edmx)を作成し、MVCアプリに必要なすべてのエンティティがあります。これまでのところ、これはすべて良いことです。

ただし、私のエンティティの1つが「顧客」エンティティであるとしましょう。MyEntites.Designer.cspartialから継承する自動生成されたクラスを見ることができます。EntityObjectこの時点で、MVCモデルにカスタムビジネスロジックを追加したいと思います。当然のことながら、答えはpartial「顧客」という名前のモデルで作成された独自のクラスを使用することだと思います。

質問をする前にこれについて多くの検索を行い、POCO、T4テンプレート、自動生成されたコードの変更などに関するあらゆる種類の情報を確認しましたが、失われました。EFから自動生成されたエンティティに独自のビジネスロジックとカスタムコードを追加するのは大変な苦痛ですか?自動生成されたコードを何度も変更したくないのは確かです。

ことわざの「電球」を続けるには、簡単な説明が必要です。そうすれば、そこから離陸できます。誰かが私がこれを行う方法に答えるのを手伝ってもらえますか?

ありがとう!

4

2 に答える 2

2

独自のクラスコードを別のファイルに保持しますが、同じクラスと名前空間を使用します。これにより、T4コードジェネレーターによってコードが上書きされるのを防ぐことができます。

EntityFrameworkで生成されたタイプの拡張

メタクラスを使用して、生成されたクラスに属性を追加することもできます。

生成されたクラスへの属性の追加

于 2012-05-10T14:32:50.793 に答える
2

これらのコードは自動生成され、モデルの更新または変更のたびに上書きされます。

モデルを拡張することで、必要なことを実現できます。EFが次のエンティティクラスを生成したとします。

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

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

        public virtual UserProfile User{ get; set; }
    }
}

また、データの注釈と属性を保持するためにいくつかの回避策を実行する必要があります。したがって、次の手順に従います。

まず、次のように2つのクラスをどこかに追加します(必要な場所に追加することをお勧めしますModels)。

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

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

次に、必要なプロパティと属性を2番目のクラスに追加します-NewsAttribsここに。:

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

    // and other properties you want...
}

ノート:

1)生成されたエンティティクラスとクラスの名前空間は同じである必要があります-ここではYourSolution

2)最初のクラスはである必要partialあり、その名前はEFで生成されたクラスと同じである必要があります。

これを通過し、あなたの属性が二度と失われることはありません...

于 2013-07-24T12:39:52.470 に答える