Это поможет, если вы предоставили 2 контекста и перекрывающиеся атрибуты Клиента. Для целей этого ответа я использую контексты: «Продажи» и «Маркетинг» и общий атрибут «Предпочтительное имя»
Моя первоначальная мысль, основанная на фразе «перекрывающиеся поля», заключается в том, что вам нужно вернуться к своей модели так как у вас не должно быть двух моделей, ответственных за конкретное значение, в противном случае у вас есть условия параллелизма/гонки.
Попробуйте и подумайте, как ваши клиенты разрешат ситуацию в старые времена пера. & бумага. Кто будет владеть файлом «клиент»? Будут ли продажи и маркетинг у каждого из них иметь собственную версию, или маркетинг будет полагаться на копию продаж (или наоборот)?
Кроме того, одним из самых мощных аспектов DDD является то, что он заставляет вас упорствовать в том, чтобы выйти в инфраструктурные слои, где они принадлежат. Вам не нужно использовать EF для всех вызовов вашего репозитория, если вам проще обрабатывать некоторые sql для определенного вызова настойчивости, тогда сделайте это.
--Scenario 1: Перекрытие поле не overlapping--
В этом случае эксперты в предметной области пришел к выводу, что Sales.Customer.PreferredName и Marketing.Customer.PreferredName независимые атрибуты и могут быть между контекстами. Маркетинг часто используется поле для их милого мы вам лучшие дружки кампании переписки в том время продаж предпочитала держать на файл наиболее не-неоднозначная таблица базы данных
ЗАКАЗЧИКА имеет 2 поля: PreferredNameSale и PreferredNameMarketing.
В 2 Бетон Хранилища будет в конечном итоге выглядеть примерно так:
class Sales.Repositories.ClientRepository : Domain.Sales.IClientRepository {
Update(Domain.Sales.Client salesClient) {
using (var db = new MyEfContext()) {
var dbClient = db.Client.Fetch(salesClient.Id);
dbClient.PreferredNameSales = salesClient.PreferredName;
db.SaveChanges();
}
}
}
class Marketing.Repositories.ClientRepository : Domain.Marketing.IClientRepository {
Update(Domain.Marketing.Client marketingClient) {
using (var db = new MyEfContext()) {
var dbClient = db.Client.Fetch(marketingClient.Id);
dbClient.PreferredNameMarketing = marketingClient.PreferredName;
db.SaveChanges();
}
}
}
Entity Framework должны заметить, что только 1 поле было изменено и послать соответствующий update client set field=newvalue where id=1
в базу данных.
Не должно быть проблем с параллелизмом, когда продажи и маркетинг обновляют свою версию одного предпочтительного имени клиентов одновременно.
Также обратите внимание, что EF обеспечивает много накладных расходов и очень мало значения здесь. Такая же работа может быть завершена с простой параметризируются SqlCommand.Execute()
--Scenario 2: Перекрытие поле overlapping--
Ваша модель сломана, но это слишком поздно, чтобы исправить это правильно.Вы лжете себе, что шансы на продажу и маркетинг, пытающиеся изменить предпочтительное имя в то же время, крошечные, и даже если это произойдет, должно быть редко, что, надеюсь, пользователь будет винить себя за неправильное использование системы.
В этом случае есть только одно поле базы данных: client.PreferredName и как с сценарием 1, функции работают на одной и той же таблицы/поля:
class Sales.Repositories.ClientRepository : Domain.Sales.IClientRepository {
Update(Domain.Sales.Client salesClient) {
using (var db = new MyEfContext()) {
var dbClient = db.Client.Fetch(salesClient.Id);
dbClient.PreferredName = salesClient.PreferredName;
db.SaveChanges();
}
}
}
class Marketing.Repositories.ClientRepository : Domain.Marketing.IClientRepository {
Update(Domain.Marketing.Client marketingClient) {
using (var db = new MyEfContext()) {
var dbClient = db.Client.Fetch(marketingClient.Id);
dbClient.PreferredName = marketingClient.PreferredName;
db.SaveChanges();
}
}
}
Очевидная проблема заключается в том, что сохранить на В то же время, как по продажам, так и по маркетингу, в конечном итоге будет выигрыш с точки зрения сохраненных данных. Вы можете попытаться смягчить это с помощью последних временных меток и т. Д., Но он просто станет более грязным и сломанным. Просмотрите свою модель и помните: DB MODEL! = DOMAIN MODEL! = UI View Model
В разных контекстах есть своя БД. – plalx
Возможный дубликат [DDD - согласованность объекта в ограниченном контексте и различные схемы в базе данных] (http://stackoverflow.com/questions/34389100/ddd-consistency-of-entity-across-bounded-context-different-schemas- in-databa) – guillaume31