2009-06-11 5 views
2

Скажем, у меня есть одна база данных, и эта база данных имеет набор таблиц, которые являются общими для всех Клиентов и некоторые таблицы, специфичные для определенных клиентов.C# Linq: Можете ли вы объединить DataContexts?

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


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


[Update]

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

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

ответ

1

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

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

2

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

+0

Я бы использовал шаблон фасада в репозитории для абстракции. Перейдя в фасад репозитория, которого вы хотите. Но из того, что я собираю из OP, он хочет объединиться, чтобы клиентский DC в какой-то степени расширил то, что предлагает базовый DC. Оба шаблона предлагают жизнеспособное направление. –

0

Я не знаю, вы уже это поняли, но слияние 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); 
0

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

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

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

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

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

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

Смежные вопросы