c# - 如何通过 T4 自动化为每个实体生成我的所有实体组成的两个表

标签 c# .net entity-framework linq-to-entities t4

我有一个使用 Entity Framework 4 的数据访问层类库项目。我的项目需要一个版本控制概念。我的数据库包含许多包含 «Id» 和 «CreationDateTime» 的表。每个表都与包含详细信息的版本表相关联。所有表都以相同的方式构建,并为版本表添加 «Version» 后缀。

我寻找一种方法来通过 T4 自动化生成我的所有实体(EF4 模型),该自动化将表和表版本(对于指定版本)统一在一个实体中。

这个统一的实体必须支持获取、插入、更新和删除操作。

是否可以通过修改其中一个 T4 模板来实现?如果是,怎么办?

非常感谢任何指点。

最佳答案

可能不是您要找的,但您可以查看 this blog post我在其中为日记/版本控制数据库做了类似的概念证明。我没有使用过 T4(这就是为什么我认为这可能不是您正在寻找的,但您可能找不到更好的解决方案)和生成的实体,但是从一个基本实体继承了所有实体版本控制属性。 基本上,我通过覆盖 SaveChanges 方法扩展了 DbContext,并在那里设置了我的版本控制属性:

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 和所有逻辑上都是私有(private)的将项目转移到历史记录将保存更改。这种方式将允许公开的公共(public)数据库集仅包含项目的当前版本,从而允许在此类上下文之上构建任何类似动态数据的通用解决方案。

关于c# - 如何通过 T4 自动化为每个实体生成我的所有实体组成的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7506408/

相关文章:

c# - 为 Kinects 深度场创建 3D 面部网格

c# - ASP.NET MVC - 显示一个项目列表,每个项目都有一个项目列表

c# - QueryOver:从子查询中选择列

.net - 发布版本与程序集(等)版本

c# - Entity Framework 级联删除 - FOREIGN KEY 约束

c# - 如何使用 EF6 获取大量记录

c# - 如何通过 Selenium、ChromeDriver 和 GoogleChrome 打开默认 Chrome 配置文件

.net - 列出进程中的 AppDomain

c# - 使用多个 dbcontext 实例和依赖注入(inject)

c# - 在 C# 中缩放窗口窗体