我一直致力于一个项目,我试图将实体框架模型化到现有的FoxPro 2.x数据库,以便使用数据,同时让表格对遗留应用程序可读(有关{{3}的详细信息) })。
我很幸运将DBContext
配置到物理数据表,并且我已经设置了大部分映射。遗留数据结构具有Bills
表,其中包含唯一的主Id密钥,但可以发布到帐单的所有LineItems
都存储在单个Charges
表中,而没有简单的主键
我的问题与代码优先EF中的鉴别器映射有关。我在我的数据对象中将表重新创建为TPH,所以我有
public abstract class Posting
{
public System.DateTime? Post_Date { get; set; }
public string Bill_Num { get; set; }
public string Type { get; set; }
public string Pcode { get; set; }
public string Pdesc { get; set; }
public decimal? Custid { get; set; }
public string Createby { get; set; }
public System.DateTime? Createdt { get; set; }
public string Createtm { get; set; }
public string Modifyby { get; set; }
public System.DateTime? Modifydt { get; set; }
public string Modifytm { get; set; }
public string Linenote { get; set; }
public decimal? Version { get; set; }
public string Id { get; set; }
public string Batch { get; set; }
public virtual Billing Bill { get; set; }
}
public abstract class Charge : Posting
{
}
public class ServiceLine : Charge
{
public string Chargeid { get; set; }
public virtual ICollection<Payment> Payments { get; set; }
}
public class ChargeVoid : Charge
{
}
public abstract class Payment : Posting
{
}
public class PaymentLine : Payment
{
public string Postid { get; set; }
public string Svc_Code { get; set; }
public string Name { get; set; }
public string Checkno { get; set; }
public System.DateTime? Checkdate { get; set; }
}
public class PaymentVoid : Payment
{
}
到目前为止我的映射策略是这样的:
public class PostingMap : EntityTypeConfiguration<Posting>
{
public PostingMap()
{
// Primary Key
this.HasKey(t => new {t.Bill_Num, t.Post_Date, t.Pcode});
this.Map<Charge>(m => m.Requires("Type").HasValue("C"))
.ToTable("Charges");
this.Map<Payment>(m => m.Requires("Type").HasValue("P"))
.ToTable("Charges");
}
}
我省略了一些字段和映射类,但这是它的核心。
每条记录都有C / P分类,因此表格中的所有内容都是Charge
或Payment
。
每个Posting
都与Bill
通过Bill_Num
外键相关联。
ServiceLine
对象仅与ChargeVoid
对象(与帐单关联的调整条目和无值信息条目)不同,具有Pcode
和{{1}的值}(仅Chargeid
标记为Bill_Num
++)。我不知道如何对此进行建模。
01
层次结构非常相似。
因此,对于我当前的设置,我Payment
没有唯一键Postings
,其Charges
子集的值为ServiceLines
和{ {1}}和Chargeid
s的子集以及与Pcode
类似的null
。 Payments
Charges
与PaymentLines
ServiceLines
Pcode
PaymentVoids
之间的Pcode = null
也是多对一的。
我有没有办法分配这个复杂的映射,因为我不能简单地区分!null
?最重要的是,一旦我设置了继承,EF会处理关键任务,还是我也会遇到问题?
另外,如果有更好的方法可以打破这个对象的继承,我很满意。