Entity Framework 在 table 上反向 poco 没有主键和空列

Entity Framework reverse poco on table without primary key and null column

我正在使用 Entity Framework 反向 POCO 生成器 v2.37.5。

我需要映射一个外部数据库。我不可能修改模式。但是表没有主键,所有列都设置为空。

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

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

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

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

    • Protip / 完全可选的支线任务和分散注意力以获得更好的 T4 编辑:
      • 提取所有 C# 代码(在 T4 <#+ #> 块内)并将其移动到名为 Entities.ttinclude.cs
      • 的新文件中
      • <#@ Include File = "Entities.ttinclude.cs" #> 添加到 Entities.ttinclude 文件。
      • Entities.ttinclude.cs 的项目构建操作更改为 None
      • 现在您可以获得 C# 代码的(基本)语法着色。
      • 现在回到您定期安排的 Whosebuging:
  2. 在第 250-320 行附近的某处查找:

    Settings.UpdateColumn = (Column column, Table table) => 
    
  3. 在函数内你可以告诉 EF 在这个 table 上完全定义了一个 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;
            }
        }
    
        // ...
    }
    
  4. 运行 Model.tt

  5. 假设没有发生错误,请查看包含生成的 .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
        }
    }
    
  6. 并且您应该能够构建您的项目,然后 运行 它应该 正常工作


你还可以定义fake外键约束和设置其他类型的关系,EF会相信你,这很方便因为当您希望 EF 像处理 TABLE 一样处理 VIEW 时,尤其是作为 SQL 中的 VIEW 服务器不能充满 PK 和 FK 约束(您可以如果您的 VIEW 是 updatable).

,也可以让 DML 工作