2011-01-17 13 views
2

私は現在、IsActive列がfalseのレコードをフィルタリングするために、EF4で条件付きマッピングを使用しています。これは意図したとおりに動作しますが、私は関係をナビゲートする際に問題にぶつかります。関係上のEF4条件付きマッピング

例として、Storeに多数のインベントリレコードを持たせることができる1対多の関係があります。ストアには、それに属するインベントリレコードと同様にIsActiveとマークすることができます。これらのテーブルのレコードを直接照会することは、意図したとおりに動作します(アクティブなレコードのみが返されます)が、関連付けられたストアがアクティブでないインベントリレコードも取得できます。これにより、非アクティブなストアにアクセスすることができ、ストアがアクティブであるかどうかを検出する方法がありません。

前条件付きマッピングを使用してに切り替えるには、我々は次のようなクエリを使用していた。

Inventories.Where(i => i.IsActive && i.Store.IsActive && i.Product.IsActive && i.Product.Id == productId); 

私たちはこれにそのクエリを簡素化することができ期待していた:

Inventories.Where(i => i.Product.Id == productId); 

これは」doesnのIsActiveで条件付きマッピングを使用することができないため、StoreまたはProductがアクティブであるかどうかを知る方法がなくなりました。

EF4で条件付きマッピングを利用している間にそのクエリを複製する方法はありますか?条件付きマッピングをこのままにしておくことを余儀なくされたのですが、すべてのクエリが関連するすべてのIsActiveフィールドを確認することを願っていますか?

+0

「条件付きマッピング」とはどういう意味ですか?あなたはTPHについて話していますか?あなたは条件付きのナビゲーションプロパティ/ FKを持つことはできません。 – RPM1984

+0

このテーブルの階層はありません。これに非常に似た何かをしてください:http://blogs.microsoft.co.il/blogs/gilf/archive/2010/06/15/using-conditional-mapping-inentity-framework .aspx –

+0

私の$ 0.02:これはあなたのマッピングではなくあなたのサービス層にあるはずです。 –

答えて

0

他の答えはいくつかのために働くかもしれないが、我々は代わりにビューにEFのEntitySetをマッピングすることを決めました。ビューは適切なテーブルに結合し、適切なIsActiveフィールドをチェックします。結果として得られるEDMXの部分は、次のようになります。

<EntitySet Name="Inventory" EntityType="Model.Store.Inventory" store:Type="Views" store:Schema="dbo" store:Name="Inventory"> 
    <DefiningQuery>SELECT 
    [ActiveInventory].[InventoryId] AS [InventoryId], 
    {Other columns being selected} 
    FROM [dbo].[ActiveInventory] AS [ActiveInventory]</DefiningQuery> 
</EntitySet> 
1

式ビジターを作成して、それらのプロパティーを照会に追加することができます。

例:

public abstract class ActiveObject 
{ 
    public bool IsActive { get; set; } 

    protected ActiveObject() 
    { 
     this.IsActive = true; 
    } 
} 

public class Inventory : ActiveObject 
{ 
    public Product Product { get; private set; } 

    public Store Store { get; private set; } 

    public Inventory() 
    { 
     this.Store = new Store(); 
     this.Product = new Product { Id = 10 }; 
    } 
} 

public class Product : ActiveObject 
{ 
    public int Id { get; set; } 
} 

public class Store : ActiveObject 
{ 
    public int Id { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     Expression<Func<Inventory, bool>> expression = i => i.Product.Id == 10; 
     Expression<Func<Inventory, bool>> expression2 = Rewrite(expression); 
    } 

    private static Expression<Func<Inventory, bool>> Rewrite(Expression<Func<Inventory, bool>> lambdaExpression) 
    { 
     var inventory = lambdaExpression.Parameters[0]; 
     return Expression.Lambda<Func<Inventory, bool>>(
      Expression.AndAlso(
       Expression.AndAlso(
        Expression.Property(
         inventory, 
         "IsActive" 
        ), 
        Expression.AndAlso(
         Expression.Property(
          Expression.Property(
           inventory, 
           "Store" 
          ), 
          "IsActive" 
         ), 
         Expression.Property(
          Expression.Property(
           inventory, 
           "Product" 
          ), 
          "IsActive" 
         ) 
        ) 
       ), 
       lambdaExpression.Body 
      ), 
      inventory 
     ); 
    } 
}