web-dev-qa-db-ja.com

Entityフレームワークにインターフェースを実装させる

EntityフレームワークとNinjectでIoCを使用したいと思います。インターフェイス、ICRUDを実装するには、生成されたエンティティークラスが必要だと思います。 Entityフレームワークにインターフェースを実装させる方法を示す walkthrough があります。私は指示に従いましたが、私のEntityObjectCodeGenerator.csファイルは確かに「ICrud」を示していますが、インターフェースを実装していません。 EntityObjectCodeGenerator.ttの下にサブクラスは表示されません。エラーが出る

「BugnetMvc.Models.BugNetEntities」はインターフェースメンバー「BugnetMvc.Services.ICrud.Update()」を実装していません

[〜#〜]更新[〜#〜]
目標は、厳密に型指定されたビューと部分ビューもサポートするエンティティフレームワークを利用して、テスト可能で拡張可能なMVC-3イントラネットを作成することです。これまでのNinjectの小さなレベルの経験から、コントローラー自体のコンストラクターにビュー自体のサービス(各インターフェースで使用可能なCRUDメソッドを想定)と各部分ビューのサービスをオーバーロードする必要があると思います。

例えば。

public HomeController(HomeService homeCrudService, PartialViewService1 partialviewService)

Update2
明確にし、うまくいけば他の人を助けるために、コードは次のように実装できます。

これはエンティティを拡張する方法です

namespace BugnetMvc.Models//ensure namespace matches entity
{
    public partial class Milestone : ICrud<Milestone>//Entity, note the CRUD generic.  This gives us a lot of flexibility working with Ninject
    {
        public bool Create()
        {
            throw new System.NotImplementedException();
        }

        public List<Milestone> Read()
        {
            var milestones = new List<Milestone>();

            var result = from a in new BugNetEntities1().Milestones
                            where a.MilestoneID >= 0
                            select new { a.Milestone1 };

            milestones = result.AsEnumerable()
                                        .Select(o => new Models.Milestone
                                        {
                                            Milestone1 = o.Milestone1
                                        }).ToList();
            return milestones;
        }

        public bool Update()
        {
            throw new System.NotImplementedException();
        }

        public bool Delete()
        {
            throw new System.NotImplementedException();
        }
    }

Mockエンティティの例:

namespace BugnetMvc.Services
{
    public class MilestoneServiceMock : ICrud<MilestoneMock>
    {
        public MilestoneServiceMock()
        {

        }

        public bool Create()
        {
            throw new System.NotImplementedException();
        }

        public bool Update()
        {
            throw new System.NotImplementedException();
        }

        public bool Delete()
        {
            throw new System.NotImplementedException();
        }


        List<MilestoneMock> ICrud<MilestoneMock>.Read()
        {
            //string[] mileStones = new string[14];
            List<MilestoneMock> milestoneMocks = new List<MilestoneMock>();
            milestoneMocks.Add(new MilestoneMock("New"));
            milestoneMocks.Add(new MilestoneMock("Assessment"));
            milestoneMocks.Add(new MilestoneMock("Pending Approval"));
            milestoneMocks.Add(new MilestoneMock("Pending Start"));
            milestoneMocks.Add(new MilestoneMock("Planning"));
            milestoneMocks.Add(new MilestoneMock("Dev-In Process"));
            milestoneMocks.Add(new MilestoneMock("Dev-Pending Approval to QA"));
            milestoneMocks.Add(new MilestoneMock("Dev-Pending Move to QA"));
            milestoneMocks.Add(new MilestoneMock("QA-In Process"));
            milestoneMocks.Add(new MilestoneMock("QA-UAT"));
            milestoneMocks.Add(new MilestoneMock("QA-Pending Approval to Prod"));
            milestoneMocks.Add(new MilestoneMock("QA-Pending Move to Prod"));
            milestoneMocks.Add(new MilestoneMock("On-Going"));
            return milestoneMocks;
        }
    }
}
//Global.asax
        internal class SiteModule : NinjectModule
        {
            public override void Load()
            {
                bool MOCKDB = true;
                MOCKDB = false;
                if (MOCKDB)
                {
                    //Set up ninject bindings here.
                    Bind<ICrud<MilestoneMock>>().To<MilestoneServiceMock>();
                    Bind<ICrud<Application>>().To<ApplicationService>();
                }
                else
                {
                    //Set up ninject bindings here.
                    Bind<ICrud<Milestone>>().To<Milestone>();
                    Bind<ICrud<Application>>().To<ApplicationService>();
                }
            }
        }

Read(int Id)の必要性が発生する可能性があります。その場合、上記と同じ基本的なアイデアを使用する新しいインターフェイスでうまくいくはずです。 ICrudを更新して、モデルタイプをメソッドに渡すこともできます。たくさんのオプションがあります。 Jon Skeetの専門家の指導に感謝します。

31
P.Brian.Mackey

おそらく生成されたエンティティークラスは部分クラスですよね?

その場合は、独自の部分クラスファイルを追加して、実装するインターフェイスを指定し、必要な実際の実装方法を提供できます。生成されるものを変更するよりもはるかに簡単だと思います。

57
Jon Skeet

インターフェイスの実装は、変更中にT4テンプレートに追加されます。スクリーンショットには表示されていませんが、ユーザーがT4テンプレートにIValidateインターフェースを実装する必要があることがアイテム13として示されています。実装が提供されると、生成されたクラスにもそれらの実装が含まれます。

ユーザー:生成されたクラス(.ttファイルの下)がIValidateインターフェイスを期待どおりに実装することに注意してください

7
amit_g

すべてのエンティティから派生する基本クラス(EntityModelの外)を作成し(T4テンプレートファイルの簡単な変更)、基本クラスにインターフェイスを1回実装するのはどうですか。それは私にとって完璧に動作します。

1
Bernoulli IT

少し前のことですが、T4テンプレートを使用してこれを行いました...この投稿を参照してください: 監査のようなEntityFrameworkトリガー

0
Nix