没有主键和空列的表上的实体框架反向 poco

Posted

技术标签:

【中文标题】没有主键和空列的表上的实体框架反向 poco【英文标题】:Entity Framework reverse poco on table without primary key and null column 【发布时间】:2022-01-16 05:23:01 【问题描述】:

我正在使用实体框架反向 POCO 生成器 v2.37.5。

我需要映射一个外部数据库。我无法修改架构。但是表没有主键,所有列都设置为空。

但是,某些列的组合始终是唯一的。 例如,可以将以下 3 列组合成主键:

注册人数 幼崽麻痹 SeqVal

模板中是否有任何设置可以帮助我将列组合设置为主键?

任何建议/方向将不胜感激。

【问题讨论】:

“我正在使用实体框架反向 POCO 生成器 v2.37.5。” - 整洁,我努力了 :) 【参考方案1】:

    首先,找到您的Entities.ttinclude 文件。

    Protip / 完全可选的支线任务和分心,以获得更好的 T4 编辑: 提取所有 C# 代码(在 T4 <#+ #> 块内)并将其移动到名为 Entities.ttinclude.cs 的新文件中 <#@ Include File = "Entities.ttinclude.cs" #> 添加到Entities.ttinclude 文件中。 Entities.ttinclude.cs 的项目构建操作更改为None 现在您可以获得 C# 代码的(基本)语法着色。 现在回到您定期安排的堆栈溢出:

    在第 250-320 行附近寻找这个:

    Settings.UpdateColumn = (Column column, Table table) => 
    

    在函数内部,你可以告诉 EF,这个表上完全定义了一个 PK,我发誓! 就像这样:

    Settings.UpdateColumn = (Column column, Table table) => 
    
        // ...
    
        if( column.ParentTable.Name == "Memb" )
        
            switch( column.Name )
            
            case "EnrollNumb":
            case "CubNumb":
            case "SeqVal":
    
                column.IsNullable        = false; // PK columns cannot be NULLable.
                column.IsPrimaryKey      = true;
                column.PrimaryKeyOrdinal = column.Ordinal;
    
                column.ParentTable.HasPrimaryKey = true
    
                break;
            
        
    
        // ...
    
    

    运行Model.tt

    假设没有发生错误,查看包含生成的.cs 文件的文件夹,查找Memb.Configuration.cs。它应该看起来像这样:

    [System.CodeDom.Compiler.GeneratedCode("EF.Reverse.POCO.Generator", "2.37.1.0")]
    internal class MembConfiguration : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Memb>
    
        public MembConfiguration( String schema )
        
            ToTable( "Memb", schema );
            HasKey( x => new  x.EnrollNumb, x.CubNumb, x.SeqVal  );
    
            Property( x => x.EnrollNumb ).HasColumnName( "EnrollNumb" ).HasColumnType( "nvarchar" ).IsRequired().MaxLength(10);
            Property( x => x.CubNumb    ).HasColumnName( "CubNumb"    ).HasColumnType( "nvarchar" ).IsRequired().MaxLength(50);
            Property( x => x.SeqVal     ).HasColumnName( "SeqVal"     ).HasColumnType( "nvarchar" ).IsRequired().MaxLength(5);
    
            // other columns here
        
    
    

    您应该能够构建您的项目,然后运行它,它应该正常工作


您还可以定义 fake 外键约束并设置其他类型的关系,EF 会相信您,当您希望 EF 处理VIEW 就好像它是 TABLE,特别是因为 SQL Server 中的 VIEW 不能被 PK 和 FK 约束(如果你的 VIEW 是可更新的,你也可以让 DML 工作)。

【讨论】:

感谢详细步骤。让我试试。快速提问...步骤 1 是强制性的吗? @JGV 请引用您解释为“第 1 步”的指令 当然,在您提到的答案中,1. 首先,找到您的 Entities.ttinclude 文件...以及后面的要点。我指的是那个。 @JGV 啊,不-这完全是可选的(请参阅“支线任务”的位置)。您可以跳过这些项目符号。 @JGV 重复的IsPrimaryKey = true 行是一个错字。谢谢你。我已经删除了。

以上是关于没有主键和空列的表上的实体框架反向 poco的主要内容,如果未能解决你的问题,请参考以下文章

可以将@Id添加到映射到Spring boot Jpa中没有主键列的表的实体吗?

实体框架 4.1 代码优先映射到将主键作为外键列的表

如何在没有主键的表上按顺序更新表?

没有主键和可为空字段的休眠实体

实体框架代码优先主键约束名称

创建复合键实体框架