1

我正在使用 EF 4.3 并且正在访问 Oracle 数据库。由于 EF 如何为 Oracle 数据库生成 SQL,并且因为 EF 4.3 不允许添加自定义约定,我必须手动为所有大写的每个属性指定列名。

[Column("MYPROPERTY")]
public string MyProperty { get; set; }

那么,对于使用复杂类型的属性,我能做些什么呢?我有以下复杂类型:

public class Minute {
    public int Value { get; set; }
}

和以下 DbContext:

public class MyDbContext : DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<Minutes>().Property(x => x.Value);
    }
}

我的实体:

[Table("MYENTITY")]
public class MyEntity {
    [Column("MYPROPERTY")]
    public string MyProperty { get; set; }
    [Column("MYMINUTES")] //this does nothing
    public Minutes MyMinutes { get; set; }
}

在生成的 SQL 中,该MyMinutes属性被映射到一个不存在的"Extent1"."MyMinutes_Value"...我想要的"Extent1"."MYMINUTES"

除了把头撞在桌子上,我还能在这里做什么?

4

1 回答 1

0

答案相当简单,但没有很好的记录。据我所知,它不能用属性来完成。在 datacontext 的 OnModelCreating 方法中添加一行:

public class MyDbContext : DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.ComplexType<Minutes>().Property(x => x.Value);
        modelBuilder.Entity<MyEntity>().Property(x => x.MyMinutes.Value).HasColumnName("MYMINUTES");
    }
}

因此,该方法的第一行通常设置复杂类型。第二行具体告诉 EF 如何在 MyEntity 类上映射属性。中提琴!

于 2012-06-21T23:06:11.907 回答