如何使用实体框架中的TPT提高性能

时间:2015-07-29 03:17:37

标签: c# entity-framework entity-framework-6

我一直在实体框架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();

0 个答案:

没有答案