如何使用代码优先 EF 4.3 将具有复杂类型的属性映射到特定表列
本文关键字:映射 属性 类型 复杂 代码 何使用 EF | 更新日期: 2023-09-27 18:36:07
我有以下类型:
public class Minutes
{
public double Value { get; set; }
}
此类型用于如下所示的实体:
public class Race
{
public string Name { get; set; }
public string Location { get; set; }
public Minutes TotalMinutes { get; set; }
}
我有一个像这样的 DbContext:
public class RaceDataContext: DbContext
{
public DbSet<Race> Races { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.ComplexType<Minutes>().Property(x => x.Value);
}
}
在应用程序开发中,我们一直在使用 MS-SQL 数据库,没有问题。现在,我们必须移动到客户端的 Oracle 数据库。Oracle 数据库有固定的表,其中包含我们无法更改的列。我们需要能够阅读、更新和插入种族。因此,我将映射代码更新为如下所示:
public class RaceDataContext: DbContext
{
public DbSet<Race> Races { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.ComplexType<Minutes>().Property(x => x.Value);
modelBuilder.Entity<Race>().Property(x => x.TotalMinutes).HasColumnName("RACEMINUTES"); // <-- ERROR HERE
}
}
上面的代码无法编译。它说总分钟数必须是一个不可为空的值才能用作 .属性() 方法。下面是生成输出中的实际错误:
类型"Races.Minutes"必须是不可为空的值类型,以便 将其用作泛型类型或方法中的参数"T" 'System.Data.Entity.ModelConfiguration.Configuration.StructuralTypeConfiguration.Property(System.Linq.Expressions.Expression>)' C:''Projects''Races''RaceDataContext.cs
你已经接近解决方案了。
modelBuilder.Entity<Race>().Property(x => x.TotalMinutes.Value)
.HasColumnName("RACEMINUTES");