2009-08-17 13 views
0

私は何をしようとしているのかを説明しましょう。Asp.Net MVCエンティティフレームワーク上書き可能な値を持つ親子子

WebsitePageという名前のテーブルがあります。このテーブルには、自分のサイトのすべてのページとそのページに関する情報が含まれています。次に、私はすべての顧客についてCustomerテーブルを持っています。次に、WebsiteWebsitePageという別のテーブルがあり、これはWebsitePageテーブルのいくつかの列の顧客の値を格納します。

したがって、エンティティフレームワークを使用して、これら3つのテーブルをインポートしました。私ができるようにしたいのは、値があれば、CustomerWebsitePageの値を持つ強く型付けされたWebsitePageリストを返すことです。たとえば、私の顧客の1人が私のウェブサイトのページの1つにCustomerWebsitePageNameを追加したとします。その場合、WebsitePage名の代わりにCustomerWebsitePageNameを含むWebsitePagesのリストを返したいと思います。しかし、それが上書きされていないので、他のすべてのWebページの元の名前。

私のWebsitePageテーブルには親子関係のための外部キーがあります。だから、私は同時に子供WebsitePagesを返すしたいと思います。私は関数のインポートを使用して私が望むものを得ることを試みたが、もちろん私はChildPagesを失った。

私は、EntityフレームワークとLINQを使用したいものを得るためにすべてを試しました。しかし、これまでのところ私が試したほとんどのものは、例外がスローされて終了します。ここではいくつかある:

  • をEntityCollectionはすでに
  • エンティティまたは複合型「MyEntityModel.WebsitePage」はLINQのエンティティへのクエリで構築することができません初期化されています。

私はすべてこの問題を回避することができる方法の一つのアイデアを持っている、そしてそれは私のWebsitePageテーブルにParentPageIDを複製することですが、これは本当に原則の多くに違反しているようだと、私は本当にただありませんこれに関連するメンテナンスの頭痛を追加したい。

誰でもこのタイプのものを達成するためのアイデアはありますか?

A simple DB diagram. http://images.tehone.com/screenshots/2009-08-17_013009.png

+0

あなたはエンティティクエリに悪いLINQを書いたように見えますが、実際にそのクエリと、それを使用するコードを見ることなく、それはするのは難しいです確かに。一見すると、あなたのDBマッピングはそのまま現れます。 –

答えて

1

あなたが戻る必要があるオブジェクトがCustomerWebsitePageないWebsitePageです。その理由は、どのフィールド(CustomerPageまたはWebsitePage)を使用するかを決定するプロパティが必要になるため、返すオブジェクトはすべて顧客について知っていなければならないからです。

これを考慮すると、ページの列挙を返すCustomerWebsitePage.GetAllPagesForCustomer(Customer c)関数を持つことができます。ただし、探している機能を実現するには、CustomerWebsitePageにいくつかのリードスループロパティを実装する必要があります。名前の例を見てみましょう。ここCustomerWebsitePageでそれを実装する方法を次のようになります。この設定では、これらのEF LINQクエリを実行することができなかったこと

public IEnumerable<CustomerWebPage> Children 
{ 
    get 
    { 
     return WebsitePage.Children.Select(it => it.Customer.CustomerID == this.CustomerID);  } 
} 

注:子供のページの場合

public string Name 
{ 
    get{ if(String.IsNullOrEmpty(CustomerWebsitePageName)) 
      return WebsitePage.Name; 
     return CustomerWebsitePageName; } 
} 

を、あなたは、プロパティを持つことができます新しいフィールド(オブジェクト自体にのみ存在し、データベースマッピングには存在しないため)。すべての子をシームレスにロードしたい場合は、Load()を使用してコードをペイントできますが、パフォーマンスが低下します。すべての子がロードされていることを確認するには、次のローディング機能を試してみてください。

IEnumerable<CusomterWebPage> GetAllPagesForCustomer(Customer c) 
{ 
    return Context.CustomerWebPageSet.Include("WebsitePage").Where(it => it.Customer.CustomerID == c.CustomerID); 
} 
+0

アドバイスをいただきありがとうございます。私は完全に別のルートに行き、厳密に型指定されたオブジェクトを使用して優先させることにしました。代わりに、私はちょうどこのデータのループでそれを処理しています。私は、特定の値をオーバーライドしてこの種の継承をしようとしているときに、これがEntityフレームワークを使用することの限界であると言えるでしょう。誰かが知っている、私はエンティティフレームワークを使用してこの継承を作成することさえできるかもしれません。しかし、今は少なくとも私は手動で処理しています。 ありがとうございます。 – TehOne

関連する問題