EF4 условное отображение отношений - PullRequest
2 голосов
/ 17 января 2011

В настоящее время я использую условные отображения в EF4, чтобы отфильтровать все записи, в которых их столбец IsActive имеет значение false.Это работает как задумано, но я сталкиваюсь с проблемой при навигации по отношениям.

Например, у меня есть отношение один ко многим, когда в Магазине может быть много записей инвентаризации.Магазин может быть помечен как IsActive, как и записи инвентаризации, которые ему принадлежат.Запрос непосредственно для записей в этих таблицах работает как задумано (возвращаются только активные записи), но я также могу получить записи инвентаризации, где связанное хранилище не активно.Это позволяет получить доступ к неактивному хранилищу и не дает возможности определить, является ли хранилище активным.

До перехода к использованию условного сопоставления мы использовали запросы, подобные следующим:

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

Я надеялся, что мы могли бы упростить этот запрос до этого:

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

Это не работает для меня, так как у меня больше нет возможности узнать, активны ли Магазин или Продукт (так как я не могу использовать условное сопоставление для IsActive, все еще сопоставляя этот столбец).

Есть ли способ репликации этого запроса, используя преимущества условного сопоставления в EF4?Я вынужден отказаться от условного отображения и надеяться, что все запросы проверят все соответствующие поля IsActive?

Ответы [ 2 ]

1 голос
/ 27 февраля 2011

Вы можете написать выражение посетитель, чтобы добавить эти свойства в ваш запрос.

Пример:

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
        );
    }   
}
0 голосов
/ 16 мая 2011

Хотя другой ответ может работать для некоторых, мы решили вместо этого сопоставить 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...