ОК, я тестировал в бета-версии EF 5, но думаю, что это должно работать так же.Это своего рода обходной путь, но вы можете жить с ним.Часть дискриминатора, кажется, не работает, когда это сложный тип, поэтому я инициализировал его в соответствующих конструкторах.
У меня есть это, и это работает:
public class Measurement
{
[Key,
Column("Id"),
DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public DateTime MTime { get; set; }
public virtual Unit Value { get; set; }
}
[ComplexType]
public class Unit
{
protected Unit()
{
}
protected Unit(double value)
{
Value = value;
}
[Column("Value")]
public double Value { get; set; }
[Column("TypeName")]
public string TypeName { get; set; }
}
public class Celsius : Unit
{
public Celsius(double value) : base(value)
{
TypeName = "Celsius";
}
public static explicit operator Kelvin(Celsius c)
{
return new Kelvin(c.Degrees + 273.16d);
}
public double Degrees
{
get { return this.Value; }
}
}
public class Kelvin : Unit
{
public Kelvin(double value) : base(value)
{
TypeName = "Kelvin";
}
public static explicit operator Celsius(Kelvin k)
{
return new Celsius(k.Degrees - 273.16d);
}
public double Degrees
{
get { return this.Value; }
}
}
class TestContext : DbContext
{
public DbSet<Measurement> Measurements { get; set; }
}
Вот миграциикод для этого, чтобы увидеть, что генерируется в БД:
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Measurements",
c => new
{
Id = c.Long(nullable: false, identity: true),
MTime = c.DateTime(nullable: false),
Value = c.Double(nullable: false),
TypeName = c.String(),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropTable("dbo.Measurements");
}
}