我正在使用使用 Devart Entity Developer 生成的模型(.edml 文件,我理解它与 .edmx 最相似)来生成实体类,其关系在 DbContext 类中初始化。数据库架构没有为 View1 指定任何 PK,并且所有列都可以为空。但是代码生成假定对于缺少主键的视图,所有列都是键。即, .ssdl 具有 Key 元素下的所有列,并且 DbContext 具有在 all 上指定的 .IsRequired() ,如下所示:
ssdl摘录:
...
<EntityType Name="View1">
<Key>
<PropertyRef Name="FirstCol" />
<PropertyRef Name="Col2" />
<PropertyRef Name="LastCol" />
</Key>
<Property Name="FirstCol" Type="VARCHAR2" Nullable="false" MaxLength="4000" />
<Property Name="Col2" Type="VARCHAR2" Nullable="false" MaxLength="120" />
<Property Name="LastCol" Type="VARCHAR2" Nullable="false" MaxLength="20" />
</EntityType>
....
来自 DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
#region View1
modelBuilder.Entity<View1>()
.HasKey(p => new { p.FirstCol, p.Col2, p.LastCol})
.ToTable("View1", "Owner");
// Properties:
modelBuilder.Entity<View1>()
.Property(p => p.FirstCol)
.HasColumnName("FirstCol")
.IsRequired()
.HasMaxLength(4000)
.HasColumnType("VARCHAR2");
modelBuilder.Entity<View1>()
.Property(p => p.Col2)
.HasColumnName("Col2")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("VARCHAR2");
modelBuilder.Entity<View1>()
.Property(p => p.LastCol)
.IsRequired()
.HasMaxLength(20)
.HasColumnType("VARCHAR2");
这会导致 NullReferenceException,当查询将返回具有空值的 PK 列之一的行时。
有没有办法在 EF 中表示视图而不指定键或更改数据库架构?我发现了这个:http ://elegantcode.com/2012/03/15/querying-entityframework-views-without-a-key/
这是首选的解决方案吗?我想我也可以使用 DefiningQuery,但这似乎重复了用于生成视图的 sql?