Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将键属性映射到EF CodeFirst中继承实体上的不同列类型?_C#_Oracle_Ef Code First_Entity Framework 4.3_Table Per Type - Fatal编程技术网

C# 如何将键属性映射到EF CodeFirst中继承实体上的不同列类型?

C# 如何将键属性映射到EF CodeFirst中继承实体上的不同列类型?,c#,oracle,ef-code-first,entity-framework-4.3,table-per-type,C#,Oracle,Ef Code First,Entity Framework 4.3,Table Per Type,我试图在EF 4.3 CodeFirst中为现有Oracle数据库(我无法控制)实现TPC继承模型。我有几个子类型,每个子类型映射到自己的表。不幸的是,一些关键列的数据类型是number(18,0),而不是integer。EF现在似乎恨我 这是我的基本类: public abstract class Vehicle { public virtual int Id { get; set;} public virtual string Color { get; set; }

我试图在EF 4.3 CodeFirst中为现有Oracle数据库(我无法控制)实现TPC继承模型。我有几个子类型,每个子类型映射到自己的表。不幸的是,一些关键列的数据类型是
number(18,0)
,而不是
integer
。EF现在似乎恨我

这是我的基本类:

public abstract class Vehicle
{
    public virtual int Id { get; set;}
    public virtual string Color { get; set; }
    //more properties
}
以下是一些示例子类型:

public class Car : Vehicle
{        
    //more properties
}

public class Truck : Vehicle
{
    //more properties
}

public class Motorcycle : Vehicle
{
    //more properties
}
这是我的数据库:

public class VehicleDataContext : DbContext
{
    public DbSet<Vehicle> Vehicles { get; set; }
    public DbSet<Car> Cars { get; set; }
    public DbSet<Truck> Trucks { get; set; }
    public DbSet<Motorcycle> Motorcycles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Vehicle>().HasKey(x => x.Id);

        modelBuilder.Entity<Car>().Map(m => m.MapInheritedProperties());
        modelBuilder.Entity<Car>().Property(x => x.Id).HasColumnType("decimal");

        modelBuilder.Entity<Truck>().Map(m => m.MapInheritedProperties());
        modelBuilder.Entity<Truck>().Property(x => x.Id).HasColumnType("int");

        modelBuilder.Entity<Motorcycle>().Map(m => m.MapInheritedProperties());
        modelBuilder.Entity<Motorcycle>().Property(x => x.Id).HasColumnType("decimal");

        base.OnModelCreating(modelBuilder);
    }
}
引发的异常是:

概念端属性“Id”已映射到存储 类型为“decimal”的属性。如果概念侧属性为 映射到存储模型中的多个属性,请确保 存储模型中的属性具有相同的类型

如上所述,我无法控制数据库及其类型。键类型混合是愚蠢的,但“它就是它”


我该如何解决这个问题?

您无法通过映射实现它。这首先是EF代码的限制。在继承结构中,每个属性(包括键)只能映射一次。因此,您可以在继承树中的所有实体中使用整数或小数,但不能混合使用


顺便说一句,如果您尝试对整个继承树使用
int
decimal
,会发生什么?加载或持久化实体是否失败?如果不是,你可以简单地对所有实体使用一个(可能是
十进制的
,如果它可以使用整个范围的话)。

你的工作解决了这个问题。我对所有类型使用了
decimal
,我的主键停止抱怨了。谢谢
[TestFixture]
public class when_retrieving_all_vehicles
{
    [Test]
    public void it_should_return_a_list_of_vehicles_regardless_of_type()
    {
        var dc = new VehicleDataContext();
        var vehicles = dc.Vehicles.ToList(); //throws exception here
        Assert.Greater(vehicles.Count, 0);
    }
}