Entity Framework 在 table 上反向 poco 没有主键和空列
Entity Framework reverse poco on table without primary key and null column
我正在使用 Entity Framework 反向 POCO 生成器 v2.37.5。
我需要映射一个外部数据库。我不可能修改模式。但是表没有主键,所有列都设置为空。
但是,某些列的组合始终是唯一的。
例如,可以将以下 3 列组合起来形成主键:
- 注册人数
- 立方数
- 序列值
模板中是否有任何设置可以帮助我将列组合设置为主键?
任何建议/方向将不胜感激。
首先,找到您的 Entities.ttinclude
文件。
- Protip / 完全可选的支线任务和分散注意力以获得更好的 T4 编辑:
- 提取所有 C# 代码(在 T4
<#+ #>
块内)并将其移动到名为 Entities.ttinclude.cs
的新文件中
- 将
<#@ Include File = "Entities.ttinclude.cs" #>
添加到 Entities.ttinclude
文件。
- 将
Entities.ttinclude.cs
的项目构建操作更改为 None
。
- 现在您可以获得 C# 代码的(基本)语法着色。
- 现在回到您定期安排的 Whosebuging:
在第 250-320 行附近的某处查找:
Settings.UpdateColumn = (Column column, Table table) =>
在函数内你可以告诉 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;
}
}
// ...
}
运行 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 像处理 TABLE
一样处理 VIEW
时,尤其是作为 SQL 中的 VIEW
服务器不能充满 PK 和 FK 约束(您可以如果您的 VIEW
是 updatable).
,也可以让 DML 工作
我正在使用 Entity Framework 反向 POCO 生成器 v2.37.5。
我需要映射一个外部数据库。我不可能修改模式。但是表没有主键,所有列都设置为空。
但是,某些列的组合始终是唯一的。 例如,可以将以下 3 列组合起来形成主键:
- 注册人数
- 立方数
- 序列值
模板中是否有任何设置可以帮助我将列组合设置为主键?
任何建议/方向将不胜感激。
首先,找到您的
Entities.ttinclude
文件。- Protip / 完全可选的支线任务和分散注意力以获得更好的 T4 编辑:
- 提取所有 C# 代码(在 T4
<#+ #>
块内)并将其移动到名为Entities.ttinclude.cs
的新文件中
- 将
<#@ Include File = "Entities.ttinclude.cs" #>
添加到Entities.ttinclude
文件。 - 将
Entities.ttinclude.cs
的项目构建操作更改为None
。 - 现在您可以获得 C# 代码的(基本)语法着色。
- 现在回到您定期安排的 Whosebuging:
- 提取所有 C# 代码(在 T4
- Protip / 完全可选的支线任务和分散注意力以获得更好的 T4 编辑:
在第 250-320 行附近的某处查找:
Settings.UpdateColumn = (Column column, Table table) =>
在函数内你可以告诉 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; } } // ... }
运行
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 像处理 TABLE
一样处理 VIEW
时,尤其是作为 SQL 中的 VIEW
服务器不能充满 PK 和 FK 约束(您可以如果您的 VIEW
是 updatable).