Как мне сопоставить несколько таблиц в одну сущность с внешним объединением в Entity Framework? - PullRequest
1 голос
/ 21 ноября 2011

У меня есть две таблицы:

Счет (ID, Внутренняя цена, Внешняя цена)
InvoiceSummary (InvoiceID, Variance)

В этом приложении у нас есть процесс, который проходит через таблицу Invoice, создавая представления объектов в Entity Framework. Затем приложение должно вычислить разницу между (InternalPrice - ExternalPrice) и сохранить ее в столбце Variance.

Чтобы структура объектов могла эффективно выполнять это на большом количестве строк (~ 5 миллионов), я разделила результат вычисления в отдельную таблицу. Это позволяет мне использовать представления объектов для вычисления отклонения (плюс другая бизнес-логика), а затем использовать «массовую вставку SQL», чтобы быстро вставить данные в мою базу данных (намного быстрее, чем обычное обновление Entity).

Я хотел бы объединить таблицы Invoice & InvoiceSummary в один объект сущности, сохраняя отдельные таблицы для попустительства BCP, как описано выше. Однако в InvoiceSummary не всегда может быть совпадающая строка.

Похоже, что для реализации объединенной сущности Entity Framework требуется отображение 1: 1 между двумя таблицами. Кто-нибудь знает, как я могу получить Entity Framework для представления этого с отображением от 0 до 1?

Если я не нахожу решение для структуры сущностей, я мог бы использовать представление, чтобы «скрыть» базовую структуру таблицы. Я использую SQL-сервер, который поддерживает обновляемые представления, так что это должно быть прозрачным для EF? Также приветствуются решения для альтернативных конструкций.

1 Ответ

2 голосов
/ 21 ноября 2011

Вы правы в своем заключении, что разделение сущностей (разделение одной сущности по нескольким таблицам) требует отношения 1: 1 между таблицами.Если у вас есть возможность добавить представление в базу данных, я думаю, вам лучше пойти по этому пути, а затем сопоставить это представление с одной сущностью.Есть большое предостережение с этим предложенным решением.Если вы не можете создать обновляемое представление в базе данных, вы получите представление только для чтения и сможете сопоставить только представления только для чтения, используя EDMX (конструктор).Code First не поддерживает сопоставление с представлениями только для чтения.

Существует несколько других вариантов:

  • Если вам не нужно запрашивать результаты, вы можете создать хранимую процедурув базе данных.Это может быть сопоставлено с функцией в EDMX или выполнено сначала через функцию в коде.
  • Если вам нужно запросить результаты, и вы используете EDMX, я все же думаю, что сопоставление сущности с представлением - это способидти.
  • Если вы сначала используете код и вам нужно запросить результаты, но только для чтения все в порядке, вы можете использовать dbcontext.database.executecommand.

hth (и надеюсьЯ понял все правильно, так как это было из памяти ... чему я не доверяю ... вот почему я записываю это в книги!)

...