Приведение сущностей Entity Framework в «неправильном» направлении - PullRequest
0 голосов
/ 26 марта 2009

Я использую Entity Framework и имею структуру наследования с базовым Entity (назовем его Customer) и производным Entity, назовем его AccountCustomer. Разница заключается в том, что AccountCustomer имеет дополнительные данные (например, условия оплаты и т. Д.), Которые хранятся в отдельной таблице в базе данных и, следовательно, дополнительные свойства в сущности.

Я хочу разрешить пользователям «продвигать» конкретного Клиента в качестве AccountCustomer. Мне нужно сохранить тот же первичный ключ (составной ключ, видимый пользователям и используемый в качестве справочника клиента).

На данный момент у меня такое ощущение, что вызов хранимой процедуры для создания дополнительной записи в таблице «Учетные записи» - единственный путь, но до сих пор мы не обошли Entity Framework, поэтому предпочли бы по возможности отказаться от этой техники .

Кто-нибудь имеет какие-либо решения, ориентированные на Entity Framework?

Ответы [ 2 ]

4 голосов
/ 26 марта 2009

Это один из тех сценариев "Пожалуйста, не делайте этого".

Вы думаете об этом строго в терминах таблиц, а не в объектно-ориентированных терминах.

Конкретный клиент - это конкретный клиент. Та вещь, которую он никогда не меняет. Теперь его статус может измениться, или он может приобрести дополнительные AccountProperties, но он никогда не переходит от одного вида вещей (Клиент) к другому виду вещей (AccountCustomer). Это просто не имеет смысла концептуально (родовой фрукт не превращается в яблоко, не так ли? Нет, он начинается как яблоко с одним статусом и заканчивается как яблоко с новым статусом), и это, безусловно, невозможно в объектно-ориентированном программировании .NET ... что сделает невозможным в ORM, например, EF.

Поэтому, пожалуйста, подумайте о разумном способе концептуализации этого, который приведет к разумному способу выразить это в объектно-ориентированных терминах, что приведет к разумному решению EF.

0 голосов
/ 04 июня 2013

Я решил это путем обхода.

  • Загрузить все связанные свойства навигации базового класса, включая самого себя

var customer = db.Customers.Include("whatever dependince you have").FirstOrDefault(u=>u.UserId == userId); // Вы можете повторить это для всех ваших включений

  • Кэшировать свойства навигации в локальные переменные, т.е. var profile = customer.Profile;
  • Удалить базовый класс на db.Customer.Remove(customer);
  • Создать класс с производными данными var accountCustomer = new AccountCustomer();
  • Установить все его свойства и свойства навигации из базового класса, т.е.

accountCustomer.UserId = customer.UserId;

accountCustomer.Profile = profile; // do the same for all of the properties and navigation properties from the base class

  • Добавить новый класс обратно в БД

this.Entry<T>(accountCustomer).State = EntityState.Added;

  • Звоните db.SaveChanges()

Вот и все!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...