Добавить новую запись в существующую таблицу в базе данных при создании нового объекта с использованием Entity Framework - PullRequest
1 голос
/ 15 сентября 2011

Я делаю сайт, используя ASP.NET MVC 3 и Entity Framework.Я хочу создать базу данных на основе следующего кода:



    public abstract class Document
    {
       public int DocId {get; set;}
       public DocumentType DocType {get; set;}
       public DateTime DateCreated {get; set;}
       public DateTime DateUpdated {get; set;}

    }

      public class DocumentType{
      public int TypeId {get; set;}
      public int TypeName {get; set;}
    }


    public class News: Document
    {
       public string Title {get; set;}
       public string Body {get; set;}
    }

Краткое описание: Документ является базовой сущностью для таких типов контента, как Новости (и другие).Новости наследуют Документ.Каждый документ (например, Новости) имеет свой тип документа.Например, у News есть тип с именем «News».

Вопрос: Можно ли в моем случае обновить базу данных с помощью Entity Framework Code First, добавив новые сущности, которые наследуют сущность Document и сущностьсоздание добавить новую запись в существующую таблицу DocumentType ( без удаления базы данных )?Все, чего я хочу достичь, когда я добавляю новую сущность - новую запись, которая будет добавлена ​​в таблицу DocumentType, чтобы эти данные таблицы всегда были актуальными.

Если это возможно, не могли бы вы поделиться некоторыми ссылками?или привести примеры кода?

Заранее благодарим за помощь.

1 Ответ

1 голос
/ 15 сентября 2011

Ну, вроде ... Но я не уверен, что вы действительно захотите.

Проблема не в 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, я занимался вещами с наследованием, и большую часть этого я отменил, потому что это просто вызывает слишком много проблем в моем опыте.

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