我一直在实体框架6中使用TPT(Table-Per-Type)构建应用程序。
我有这些课程
public class Person
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class Customer : Person
{
public string BillingAddress { get; set; }
}
public class Vendor : Person
{
public string Address { get; set; }
}
public class IndividualCustomer : Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime Birthday { get; set; }
}
public class CorporateCustomer : Customer
{
public string ContactPerson { get; set; }
public string CorporateTaxNo { get; set; }
}
public class SalesInvoice
{
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public Customer Customer { get; set; }
}
查询非常难看,并且在我查询基类(Person和Customer)时需要花费很长时间才能生成,但在查询派生类(IndividualCustomer& CorporateCustomer)时非常好。
我已经读过,使用TPT对性能非常不利,我正在考虑使用TPH(Table-Per-Hierarchy)。但是当我使用TPH时,在添加SalesInvoice时,我将必须验证用户是否正在发送正确的CustomerId。因为数据库将允许用户将vendorid作为CustomerId发送。使用TPT时,数据库会抛出错误。因此TPH在进行CRUD时会增加复杂性。
是否有任何建议如何改善我的案件的TPT查询?
注意:
我发现在查询基类时,如果我指定要检索的字段,例如Select(x => new {x.Id,x.Name}),查询看起来更好,不包括左外连接派生类。
我的查询:
//Querying base class
var people = ctx.People.Select(x => new {x.Id, x.Name}).ToList();
//Querying derived class
var corporates = ctx.CorporateCustomers.ToList();