C# Linq: можно ли объединить DataContexts?

Скажем, у меня есть одна база данных, и в этой базе данных есть набор таблиц, общих для всех клиентов, и несколько таблиц, специфичных для определенных клиентов.

Теперь я имею в виду создание основного DataContext, включающего только таблицы, общие для всех клиентов, а затем создание отдельных DataContext, содержащих только таблицы, специфичные для клиента.


Есть ли способ "объединить" DataContext, чтобы он стал одним контекстом? Итак, для клиента А мне нужен один DataContext, который включает в себя как общие таблицы, так и таблицы для этого конкретного клиента (получено из двух разных DataContexts) ?


[Обновление]

Я думаю, что могу сделать следующее: из частичного класса DataContext вместо того, чтобы позволить моему DataContext наследоваться от DataContext, я делаю его наследником от MyDataContext; таким образом, таблицы из MyDataContext и другого DataContext будут доступны в одном классе DataContext.

Что вы думаете об этом подходе? Конечно, с чем-то вроде этого вы можете одновременно объединить только два контекста данных...


person Andreas Grech    schedule 11.06.2009    source источник


Ответы (4)


Я бы использовал шаблон фасада. Создайте контекст фасада, который абстрагирует базовый контекст данных от пользователя. Вы можете наследоваться от Default DataContext, если хотите, и переопределить методы. В переопределениях вы можете передать его соответствующему DataContext.

person Vasu Balakrishnan    schedule 11.06.2009
comment
Я бы использовал шаблон фасада перед хранилищем для абстракции. Передав в фасад нужный вам репозиторий. Но из того, что я получаю от OP, он хочет объединиться, чтобы клиентский DC в некоторой степени расширил то, что предлагает базовый DC. Обе модели предлагают жизнеспособное направление. - person David Yancey; 11.06.2009

Я не знаю, как добиться этого прогматически.

Возможно, вы захотите взглянуть на использование шаблонов проектирования для достижения этой цели. Используя шаблоны вместе с, скажем, шаблоном репозитория, вы можете определить репозиторий базового интерфейса, от которого будут наследоваться все клиентские репозитории. Затем для каждого клиентского репозитория вы расширяете его с учетом своих конкретных потребностей.

person David Yancey    schedule 11.06.2009

Я не знаю, поняли ли вы это уже, но слияние DataContexts — не очень хорошая идея. Большая часть причин связана с отслеживанием изменений, встроенным в объект DataContext. Если бы вы могли хранить объекты сущностей отдельно, чтобы изменения влияли только на один DataContext за раз без перекрытия, вы могли бы заставить его работать, но это только кажется, что это так много проблем для такой небольшой отдачи.

Вы можете реализовать шаблон репозитория, но опять же, у вас все еще есть проблема с тем, что один DataContext не распознает объекты, созданные с помощью другого DataContext. Проект, над которым я сейчас работаю, использует только один DataContext. Сейчас в базе данных около 75 таблиц... У меня есть отношения "один к одному", "один ко многим" и "многие ко многим", и мне еще предстоит столкнуться с серьезными проблемами производительности или реализации, используя только один DataContext . Использование шаблона фасада может работать, но опять же, вам нужно спросить себя, стоит ли поддержка нескольких DataContexts, которые не могут напрямую взаимодействовать, затрачиваться.

Например, предположим, что у вас есть таблица Customer и таблица Orders. Таблица Customer находится в одном DataContext, а таблица Orders — в другом. Отношения: один клиент к нулю ко многим заказам. Поскольку они у вас есть в отдельных DataContexts, я не верю, что вы можете напрямую ссылаться на дочерний объект сущности в своем запросе. Итак, чтобы получить заказы для конкретного клиента, вас могут заставить сделать следующее:

var orders = DC2.Orders.Where(a => a.Customer_ID == (DC1.Customers.Where(a => a.Customer_ID == 7).Customer_ID);

вместо этого:

var orders = DC.Customers.Where(a => a.Customer_ID == 7).Select(a => a.Orders);
person Neil T.    schedule 27.03.2010

Мы достигли этого, используя наследование в DataContexts, мы используем EF5, Code-First и MVC4 для внешних веб-проектов.

У нас есть общий DataContext для инкапсуляции всех общих таблиц в нашей базе данных.

public partial class CommonDataContext : DbContext
{
    //Your code
}

И несколько специализированных контекстов данных, которые используют свои собственные таблицы + общие таблицы

public partial class Application1Context : CommonDataContext
{
    //Your code
}

Каждый из этих контекстов данных находится в отдельных проектах внутри одного решения. Надеюсь, это поможет.

person Raydioshead    schedule 05.04.2013