Изменение типа (Платформа Объекта) объект, который является частью иерархии наследования

Я получал эту ошибку на человечности 12.04 и во время личинки обновления и кратко после начальной загрузки ПК, но это происходило из-за неверной конфигурации на моей стороне:

у меня было два раздела на двух дисках, соединенных с mdadm, использующим RAID1. После того, как один диск отказал, я заменил его и добавил новый, но в какой-то момент при вводе команд для добавления разделов (mdadm --manage /dev/md... -a /dev/sd...) я ошибочно добавил целый диск (/dev / sdb) вместо раздела (/dev / sdb1) как часть/dev/md1. Я удалил целый диск и правильно добавил раздел, и вещи очень хорошо смотрели на/proc/mdstat, таким образом, я думал, что был закончен.

Однако после перезагрузки "ошибки: лишний участник RAID (2 найденных)". появлялся кратко на моем экране, и массив RAID не был восстановлен с моим разделы нового диска.

я должен был обнулить суперблок/dev/sdb (диск) с mdadm --zero-superblock /dev/sdb для фиксации его, который также получил буровую установку "ошибки: лишний участник RAID (2 найденных)". и от запуска и от личинки обновления.

8
задан Craig Fisher 1 September 2009 в 19:11
поделиться

2 ответа

Технически этого можно добиться с помощью хранимой процедуры. TPT не поддерживает его.

Однако я полностью согласен с Крейгом. В классической книге по программированию «Паттерны проектирования» (Addison-Wesley Professional) авторы обсуждают наследование в сравнении с композицией и приходят к выводу, что следует «отдавать предпочтение композиции перед наследованием».

4
ответ дан 5 December 2019 в 15:25
поделиться

Один из принципов ООП заключается в том, что экземпляры не могут изменять свой тип. Подумайте: можете ли вы сделать это с обычными объектами .NET? Конечно нет. Вы также не можете обойти это жесткое и быстрое правило, сохраняя их с помощью EF.

Добавление строки в БД также не меняет тип экземпляра; это просто ложь EF о том, что вы спасли. В реляционном домене вы добавляете отношение, а не изменяете класс объекта, потому что реляционный домен не знает об объектах.

Короче говоря, использование EF не меняет .NET правило, согласно которому экземпляры не могут изменять свой тип.

Что делать, когда вам нужно это сделать? Хорошо, подумайте, как это работает в вашей проблемной области. Сотрудник - это человек. Их статус занятости связан с человеком, но их статус на самом деле не личность.

Используйте композицию вместо наследования. Я бы, вероятно, смоделировал это как Person с коллекцией экземпляров Employment. По мере изменения ситуации с занятостью вы можете назначать даты прекращения / увольнения старым записям и добавлять новые записи для новых рабочих мест.

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

Отредактировано, чтобы добавить Если вы все же обойдете это путем реализации хранимой процедуры БД, убедитесь, что никто на самом деле не использует систему в то время, когда вы ее выполняете. Поскольку это совершенно незаконно в объектном пространстве .NET, Entity Framework предполагает, что этого не может быть. Если вы обойдете Entity Framework и сделаете это, а у пользователя в это время окажется живой ObjectContext, тогда этот ObjectContext будет не синхронизирован с базой данных, чего не обнаружила обычная оптимистическая защита параллелизма в Entity Framework. Вы не повредите данные, но пользователь с активным ObjectContext может увидеть некоторые невероятно странные ошибки.

7
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: