Entity framework 实体框架映射到现有的FoxPro自由表

Entity framework 实体框架映射到现有的FoxPro自由表,entity-framework,ef-code-first,mapping,foxpro,Entity Framework,Ef Code First,Mapping,Foxpro,我正在使用一组预先存在的FoxPro表。一张具体的表格 public class Charges { public string Bill_Num { get; set; } public string Type { get; set; } public string Chargeid { get; set; } public string Postid { get; set; } public DateTime Createdt { get; set;

我正在使用一组预先存在的FoxPro表。一张具体的表格

public class Charges
{
    public string Bill_Num { get; set; }
    public string Type { get; set; }
    public string Chargeid { get; set; }
    public string Postid { get; set; }
    public DateTime Createdt { get; set; }
    public DateTime Modifydt { get; set; }
    public string Createtm { get; set; }
    public string Modifytm { get; set; }
{
似乎是TPH。鉴别器是
Type
字段(
C
P
),因此我沿着以下几行进行映射:

public abstract class LineItem
{
    public string Bill_num { get; set; }
    public string Type { get; set; }
    public DateTime Createdt { get; set; }
    public DateTime Modifydt { get; set; }
    public string Createtm { get; set; }
    public string Modifytm { get; set; }
}

public class LineItemMap : EntityTypeConfiguration<LineItem>
{
    public LineItemMap()
    {
        this.Map<Charge>(m => m.Requires("Type").HasValue("C"));
        this.Map<Posting>(m => m.Requires("Type").HasValue("P"));

        this.ToTable("Charges");
        this.Property(t => t.Bill_Num).HasColumnName("Bill_Num");
        this.Property(t => t.Type).HasColumnName("Type");
        this.Property(t => t.Createdt).HasColumnName("Createdt");
        this.Property(t => t.Modifydt).HasColumnName("Modifydt");
        this.Property(t => t.Createtm).HasColumnName("Createtm");
        this.Property(t => t.Modifytm).HasColumnName("Modifytm");
    }
}
公共抽象类行项
{
公共字符串Bill_num{get;set;}
公共字符串类型{get;set;}
public DateTime Createdt{get;set;}
public DateTime Modifydt{get;set;}
公共字符串Createtm{get;set;}
公共字符串Modifytm{get;set;}
}
公共类LineItemMap:EntityTypeConfiguration
{
公共LineItemMap()
{
这个.Map(m=>m.Requires(“Type”).HasValue(“C”);
这个.Map(m=>m.Requires(“Type”).HasValue(“P”);
本表为可转帐(“费用”);
this.Property(t=>t.Bill_Num).HasColumnName(“Bill_Num”);
this.Property(t=>t.Type).HasColumnName(“Type”);
this.Property(t=>t.Createdt).HasColumnName(“Createdt”);
this.Property(t=>t.Modifydt).HasColumnName(“Modifydt”);
this.Property(t=>t.Createtm).HasColumnName(“Createtm”);
this.Property(t=>t.Modifytm).HasColumnName(“Modifytm”);
}
}

公共类收费:行项目
{
公共字符串Chargeid{get;set;}
}
公共类ChargeMap:EntityTypeConfiguration
{
公共收费地图()
{
this.HasKey(t=>t.Chargeid);
this.Property(t=>t.Chargeid)
本表为可转帐(“费用”);
this.Property(t=>t.Chargeid).HasColumnName(“Chargeid”);
}
}

公共类发布:行项目
{
公共字符串Postid{get;set;}
}
公共类发布映射:EntityTypeConfiguration
{
公开发布地图()
{
this.HasKey(t=>t.Postid);
this.Property(t=>t.Postid)
本表为可转帐(“费用”);
this.Property(t=>t.Postid).HasColumnName(“Postid”);
}
}
如果我这样做,
LineItem
缺少一个简单的主键。我认为
{t.Bill_num,t.Createdt,t.Createtm}
的组合键是唯一的,但我不确定EF和/或FoxPro提供者是否会喜欢这样

第二个问题是
费用
过账
似乎都有一个子类,它包含作废条目(aka deletes),并且似乎没有分配
费用ID
/
过账
,但它有一个鉴别器,因此它们将是带有
的派生类型。”
键值


我是否遗漏了什么,或者我的映射/关键点分配是否正确?

请查看此模板,它从现有数据库创建了模型和Fluent api,为我节省了大量时间和麻烦,我在使用它的地方创建了一个控制台应用程序,然后将生成的代码复制到我的项目中。Tom在VFP Free Tables@Raphael上写了一篇博客文章,我怀疑该模板会给我一些类似于EF Powertools反向工程功能(它在生成基本对象方面很有帮助)的东西,因为我是反向工程FoxPro表(如果我能让它工作的话)。我想试一试,看看它是否给了我更多有用的东西,但我主要是想了解如何映射我已经生成的POCO,以提供免费表中不包含的关系。@FrankPerez我实际上已经使用VFP EF Provider来生成我当前使用的POCO。Free Tables Code First博客实际上是我如何了解fluent API主键技巧的,该技巧可以解决免费表中缺少候选键的问题。这个问题涉及从表(不包含关系/继承信息)派生POCO继承。
public class Charge : LineItem
{
    public string Chargeid { get; set; }
}

public class ChargeMap : EntityTypeConfiguration<Charge>
{
    public ChargeMap()
    {
        this.HasKey(t => t.Chargeid);

        this.Property(t => t.Chargeid)

        this.ToTable("Charges");
        this.Property(t => t.Chargeid).HasColumnName("Chargeid");
    }
}
public class Posting : LineItem
{
    public string Postid { get; set; }
}

public class PostingMap : EntityTypeConfiguration<Posting>
{
    public PostingMap()
    {
        this.HasKey(t => t.Postid);

        this.Property(t => t.Postid)

        this.ToTable("Charges");
        this.Property(t => t.Postid).HasColumnName("Postid");
    }
}