没有主键和空列的表上的实体框架反向 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
文件。
<#+ #>
块内)并将其移动到名为 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的主要内容,如果未能解决你的问题,请参考以下文章