Ну, вроде ... Но я не уверен, что вы действительно захотите.
Проблема не в DocumentType, это просто запись в базе данных, и вы можете просто вставить больше записей в эту таблицу. Поэтому я проигнорировал эту сторону для этого (это просто таблица кодов).
Проблема в том, что если вы создаете новую сущность, EF должна иметь возможность хранить эту новую сущность в базе данных, поэтому она, вероятно, должна создать таблицу или что-то для нее, поэтому базу данных необходимо изменить. EF (в настоящее время) не поддерживает изменение базы данных, поэтому предложит вам удалить и создать базу данных. Теперь, если новые сущности имеют точно такие же поля, есть способ сделать это - что-то вроде
Позвольте мне начать с объяснения, что способ по умолчанию для EF иметь дело с наследованием - это иметь столбец дискриминатор в таблице «Документы», чтобы определить тип объекта для данной конкретной строки. , Это не единственный способ, и я настоятельно рекомендую вам просмотреть http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx, чтобы полностью понять это, прежде чем приступить к наследованию. Есть некоторые уродливые ошибки, в том числе в некоторых местах, где EF действительно не делает то, что вы ожидаете, когда используете наследование.
В любом случае, с учетом этих классов:
public abstract class Document
{
public int ID { get; set; }
public DateTime DateCreated { get; set; }
public DateTime DateUpdated { get; set; }
public string Title { get; set; }
public string Body { get; set; }
public Document()
{
DateCreated = DateTime.UtcNow;
DateUpdated = DateTime.UtcNow;
}
}
public class News : Document
{
}
public class NotNews : Document
{
}
и этот контекст БД
class MyContext : DbContext
{
public DbSet<Document> Documents { get; set; }
}
В результате вы получите таблицу «Документы» со следующими столбцами:
- ID
- DateCreated
- DateUpdated
- Название
- Body
- Дискриминатор
Если вы вставите, скажем, Новости и NotNews, вы получите две строки в этой таблице, одна будет иметь слово «Новости» в столбце «Дискриминатор», а другая - «NotNews».
Теперь, если вы добавите
public class BreakingNews : Document
{
}
и вставьте один из них, тогда базу данных не нужно будет удалить и заново создать, и вы получите новую строку со словом «BreakingNews» в столбце дискриминатора.
Итак, это работает. Но если вы добавите какие-либо новые свойства в любой из новых классов, это потребует изменений в базе данных. Я считаю, что даже переопределение может потребовать изменения базы данных, но вы можете проверить это достаточно легко.
Как я сказал сверху - вы можете сделать это, но я не уверен, что это хорошая идея. Когда я только начинал с EF, я занимался вещами с наследованием, и большую часть этого я отменил, потому что это просто вызывает слишком много проблем в моем опыте.