如何使用代码优先 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

如何使用代码优先 EF 4.3 将具有复杂类型的属性映射到特定表列

你已经接近解决方案了。

modelBuilder.Entity<Race>().Property(x => x.TotalMinutes.Value)
   .HasColumnName("RACEMINUTES");