Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过T4自动化为每个实体生成由两个表组成的所有我的实体_C#_.net_Entity Framework_Linq To Entities_T4 - Fatal编程技术网

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

C# 如何通过T4自动化为每个实体生成由两个表组成的所有我的实体,c#,.net,entity-framework,linq-to-entities,t4,C#,.net,Entity Framework,Linq To Entities,T4,我有一个使用EntityFramework4的数据访问层类库项目。我的项目需要一个版本控制概念。我的数据库包含许多包含«Id»和«CreationDateTime»的表。每个表都与包含详细信息的版本表相关联。所有表都以相同的方式构造,版本表的后缀为«版本» 我寻找一种通过T4自动化生成所有实体(EF4模型)的方法,该自动化将在一个实体中统一表格和表格版本(对于指定版本) 此统一实体必须支持获取、插入、更新和删除操作 是否可以通过修改一个T4模板来实现?如果是,怎么做 非常感谢您的指点。可能不是您

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

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

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

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


非常感谢您的指点。

可能不是您想要的,但您可以查看我在哪里为日志记录/版本控制数据库做了类似的概念验证。我没有使用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上是私有的,将项传输到历史的所有逻辑都在保存更改上。这种方式将允许公开的公共数据库集仅包含项的当前版本,允许在此类上下文之上构建任何动态数据,如通用解决方案。

T4模板可以生成接口和属性来“标记”实体。之后,您可以构建泛型类,以针对您的实体提供一致的策略或行为


你的问题很有趣。我将尝试使用

中的T4模板为您的案例构建一个示例,您尝试了什么?您能给出示例代码来解释现有表输出的内容以及希望它们输出的内容吗?你能给出一个你的模式的例子吗,这样我们就可以知道你想要一个表,多个表,还是共享表?如果你能在定义你的需求方面走到这一步,那么修改模板来做你想做的事情是非常容易的,因为每次保存时你都会得到关于代码生成的即时反馈。。。另外,您采用哪种开发方法?代码优先,型号优先,数据库优先?每个类的表,每个层次结构的表,等等……您有一些细节,但它们不是很清楚,因为这个问题是“单词问题”式的,而不是具体的代码/模式示例。此外,T4模板在我提到的每个场景中都不会有帮助。