Как сгенерировать все мои сущности, составив две таблицы для каждой сущности с помощью автоматизации T4 - PullRequest
18 голосов
/ 22 сентября 2011

У меня есть проект библиотеки классов для слоя доступа к данным, который использует Entity Framework 4. Мой проект нуждается в концепции управления версиями.Моя база данных содержит много таблиц, которые содержат «Id» и «CreationDateTime».Каждая таблица связана с таблицей версий, содержащей подробности.Все таблицы построены одинаковым образом и имеют суффикс «Версия» для таблицы версий.

Я ищу способ генерировать все мои сущности (модели EF4) с помощью автоматизации T4, которая объединила бы Table и TableVersion (для указанной версии) в одну сущность.

Эта единая сущность должна поддерживать операции получения, вставки, обновления и удаления.

Можно ли это сделать, изменив один из шаблонов T4?Если да, то как?

Большое спасибо за любые указатели.

Ответы [ 2 ]

1 голос
/ 02 октября 2011

Возможно, это не то, что вы ищете, но вы можете прочитать это сообщение в блоге , где я сделал аналогичное доказательство концепции ведения журнала / управления версиями базы данных.Я не использовал T4 (поэтому я думаю, что это, вероятно, не то, что вы ищете, но вы можете не найти лучшего решения) и сгенерированные сущности, но унаследовали все сущности от одной базовой сущности, которая имела управление версиямисвойства.По сути, я расширил DbContext, переопределив метод SaveChanges, и установил там свои свойства управления версиями:

foreach (var entry in this.ChangeTracker.Entries())
    {
        // Make sure that this customized save changes executes only for entities that
        // inherit from our base entity (IEntity)
        var entity = (entry.Entity as JEntity);
        if (entity == null) continue;

        switch (entry.State)
        {
            // In case entity is added, we need to set OriginalId AFTER it was saved to
            // database, as Id is generated by database and cannot be known in advance.
            // That is why we save reference to this object into insertedList and update
            // original id after object was saved.
            case System.Data.EntityState.Added:
                entity.UserCreated = user;
                entity.DateCreated = now;
                insertedList.Add(entity);
                break;

            // Deleted entity should only be marked as deleted.
            case System.Data.EntityState.Deleted:
                if (!entity.IsActive(now))
                {
                    invalidList.Add(entity);
                    continue;
                }
                entry.Reload();
                entity.DateDeleted = now;
                entity.UserDeleted = user;
                break;

            case System.Data.EntityState.Detached:
                break;

            case System.Data.EntityState.Modified:
                if (!entity.IsActive(now))
                {
                    invalidList.Add(entity);
                    continue;
                }
                entity.UserCreated = user;
                entity.DateCreated = now;

                JEntity newVersion = this.Set(entity.GetType()).Create(entity.GetType()) as JEntity;
                newVersion = this.Set(entity.GetType()).Add(newVersion) as JEntity;
                this.Entry(newVersion).CurrentValues.SetValues(entity);

                this.Entry(entity).Reload();

                entity.DateDeleted = newVersion.DateCreated;
                entity.UserDeleted = user;
                break;
            case System.Data.EntityState.Unchanged:
                break;
            default:
                break;
        }
    }

Ссылка для полного исходного кода на github приведена в статье.

Это решение использует ту же таблицу для текущейи прошлые версии сущностей, и я планирую улучшить эту концепцию, пытаясь поместить все «удаленные» версии сущностей в отдельную таблицу, которая будет закрытой для DbContext, и вся логика переноса элементов в историю будет сохранена.изменения.Этот способ позволил бы открытому общедоступному dbset содержать только текущие версии элемента, что позволило бы строить любые общие решения, подобные динамическим данным, поверх такого контекста.

0 голосов
/ 10 мая 2014

Шаблоны T4 могут генерировать интерфейс и атрибуты, чтобы «пометить» ваши объекты. После этого вы можете создавать общие классы для обеспечения согласованных политик или поведения в отношении ваших сущностей.

Ваш вопрос очень интересный. Я постараюсь построить пример для вашего случая, используя шаблоны T4 в https://entityinterfacegenerator.codeplex.com

...