Sql server 实体框架中的继承层次结构

Sql server 实体框架中的继承层次结构,sql-server,entity-framework,ef-code-first,Sql Server,Entity Framework,Ef Code First,我正在为一家飞行俱乐部开发一个数据库,该俱乐部有一张航班表和一张俱乐部会员表。不幸的是,航班必须由支付人支付,因此有一个账单提到必须支付费用的俱乐部成员 到目前为止看起来像这样 public ClubMember { public int ID{get;set;} public string FirstName{get;set;} public string LastName {get;set;} } public Flight { public int ID {get;set;} publ

我正在为一家飞行俱乐部开发一个数据库,该俱乐部有一张航班表和一张俱乐部会员表。不幸的是,航班必须由支付人支付,因此有一个账单提到必须支付费用的俱乐部成员

到目前为止看起来像这样

public ClubMember
{ 
public int ID{get;set;} 
public string FirstName{get;set;}
public string LastName {get;set;}
}
public Flight
{
public int ID {get;set;}
public ClubMember PilotPayingTheBill{get;set;}
public double EnormousPriceToBePaid {get;set;}
}
     var flights = DB.Flights
                        .Select(f => new
                        {
                            PersonName = (f.BillTo as ClubMember).FirstName + PersonName = (f.BillTo as ClubMember).LastName
                                            ,
                            OtherName = (f.BillTo as NonPayingUser).Description
                        });
很简单。。。但随后混乱的世界介入了。有时,飞机由机修工驾驶以进行维修。我不想以懒散的方式在ClubMember表中输入机械师作为虚拟记录。数据库太新了,不适合那种乱七八糟的东西。另外,EF具有在数据库中实现继承的出色能力,因此我可以像下面这样保持它的整洁:

public BillableEntity 
{
public int ID{get;set;} 
}

ClubMember : BillableEntity 
{ 
public string FirstName{get;set;}
public string LastName {get;set;}
}
NonPayingUser : BillableEntity 
{
 public string Description {get;set;}
}
public Flight
{
public int ID {get;set;}
public BillableEntity billTo{get;set;}
public double EnormousPriceToBePaid {get;set;}
}
在我流畅的配置中有了一些说明,非付费用户和俱乐部成员都被放在他们自己的表中,ID作为主键和外键-一个漂亮、简洁的设计让我非常满意。flights表中的Billto_id列不为null,因此每个航班都将始终有一个billableEntity,它将是clubMember或NonPayingUser

用TSQL编写查询非常简单

select coalesce(cm.FirstName + ' ' + cm.LastName,np.Description) as BillTo 
from Flights f
left outer join ClubMembers cm on f.billto_id = cm.ID
left outer join NonPayingUsers np on f.billto_id = np.ID
但在EF做同样的事情让我感到困惑。 Flight类有一个BillTO属性,它是BillableEntity的父类。我可以像这样把它扔给后代阶级

public ClubMember
{ 
public int ID{get;set;} 
public string FirstName{get;set;}
public string LastName {get;set;}
}
public Flight
{
public int ID {get;set;}
public ClubMember PilotPayingTheBill{get;set;}
public double EnormousPriceToBePaid {get;set;}
}
     var flights = DB.Flights
                        .Select(f => new
                        {
                            PersonName = (f.BillTo as ClubMember).FirstName + PersonName = (f.BillTo as ClubMember).LastName
                                            ,
                            OtherName = (f.BillTo as NonPayingUser).Description
                        });
但这会产生大量的TSQL


一种解决方案是编写自己的存储过程,将这些表连接在一起,并使用EF类在各个表上执行所有基本CRUD,这就是我学习的方向。但是有更好的方法吗?

这是几个类似问题的重复

EF(6,我现在看的是7RC1)总是生成大量的TSQL

我认为最好的答案是“产生大量TSQL”的问题是什么
如果查询存在特定问题,请解决该问题,否则忽略它。您将看到,在很大比例的情况下,它不会导致DBMS出现问题

这是几个类似问题的重复

EF(6,我现在看的是7RC1)总是生成大量的TSQL

我认为最好的答案是“产生大量TSQL”的问题是什么
如果查询存在特定问题,请解决该问题,否则忽略它。您将看到,在很大比例的情况下,它不会导致DBMS出现问题

我最终在BillableEntities表中创建了一个计算字段

    alter table BillableEntities drop column name;
    alter table BillableEntities add Name as (case when [Description] is null then LastName + ', ' + FirstName else [Description] end)
然后将其标记为在BIllableEntities类中生成的数据库

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string FullName { get; private set; }

这样,EF生成的SQL更易于管理。性能很好,数据完整性也很好。

我在BillableEntities表中创建了一个计算字段

    alter table BillableEntities drop column name;
    alter table BillableEntities add Name as (case when [Description] is null then LastName + ', ' + FirstName else [Description] end)
然后将其标记为在BIllableEntities类中生成的数据库

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string FullName { get; private set; }

这样,EF生成的SQL更易于管理。性能很好,数据完整性也很好。

您使用哪种继承?每层次表(TPH)、每类型表(TPT)或每具体类表(TPC)?每类型表继承使用哪种继承?每个层次结构的表(TPH)、每个类型的表(TPT)或每个具体类的表(TPC)?每个类型的表继承