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

时间:2012-06-04 00:09:50

标签: c# entity-framework-4 ef-code-first

我有以下类型:

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
    }
}

以上代码无法编译。它表示TotalMinutes必须是一个不可为空的值,可用作.Property()方法的参数。这是构建输出中的实际错误:

  

“Races.Minutes”类型必须是不可为空的值类型才能实现   在泛型类型或方法中将其用作参数“T”   'System.Data.Entity.ModelConfiguration.Configuration.StructuralTypeConfiguration.Property(System.Linq.Expressions.Expression&gt;)'C:\ Projects \ Races \ RaceDataContext.cs

1 个答案:

答案 0 :(得分:5)

你接近解决方案。

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