Entity Framework 4 наследование TPH, как изменить один тип на другой?

Я нашел некоторую информацию по этому поводу, но ее недостаточно, чтобы понять, что лучше всего подходит для этого сценария. У меня есть типичная настройка TPH с абстрактным базовым классом «Фирма». У меня есть несколько дочерних компаний "Маленькая фирма", "Большая фирма" и т.д., унаследованных от Фирмы. На самом деле у меня есть разные реалистичные классификации фирм, но в этом примере я стараюсь не усложнять. В базе данных согласно TPH у меня есть одна таблица Firm со столбцом FirmTypeId (int), который различает все эти типы. Все работает отлично, за исключением того, что у меня есть требование разрешить пользователю менять один тип фирмы на другой. Например, пользователь мог ошибиться при добавлении фирмы, и хотел бы изменить его с «Большой фирмы» на «Малую фирму». Поскольку структура сущности не позволяет отображать различающий столбец базы данных как свойство, я не верю, что есть способ изменить один тип на другой с помощью EF. Пожалуйста, поправьте меня, если я ошибаюсь. На мой взгляд, у меня есть два варианта:

  1. Не использовать TPH. Просто создайте Firm Entity и вернитесь к использованию .Where (FirmTypeId == something), чтобы различать типы.
  2. Выполните SQL напрямую, используя context.ExecuteStoreCommand, чтобы обновить столбец FirmTypeId базы данных.

Я видел пост, в котором люди предполагают, что одним из принципов ООП является то, что экземпляры не могут изменять свой тип. Хотя для меня это имеет смысл, я просто не могу соединить точки. Если бы мы следовали этому правилу, тогда единственный вариант использования любого типа наследования (TPH / TPT) - это когда вы уверены, что один тип никогда не будет преобразован в другой. Таким образом, маленькая фирма никогда не превратится в большую фирму. Я вижу предложения вместо этого использовать композицию. Хотя для меня это не имеет смысла (то есть я не понимаю, как у фирмы есть большая фирма, для меня большая фирма - это фирма), я вижу, как можно смоделировать композицию в EF, если данные несколько таблиц. Однако в ситуации, когда у меня есть одна таблица в базе данных, кажется, что это TPH или то, что я описал в пунктах 1 и 2 выше.

5
задан e36M3 3 November 2010 в 20:27
поделиться