当前位置: 首页 > 编程语言 > .NET综合 > 正文

LINQ to SQL语句(25)之继承

时间:2010-12-11 博客园 李永京

继承支持

LINQ to SQL 支持单表映射,其整个继承层次结构存储在单个数据库表中。该表包含整个层次结构的所有可能数据列的平展联合。(联合是 将两个表组合成一个表的结果,组合后的表包含任一原始表中存在的行。)每行 中不适用于该行所表示的实例类型的列为 null。

单表映射策略是最简单 的继承表示形式,为许多不同类别的查询提供了良好的性能特征,如果我们要在 LINQ to SQL 中实现这种映射,必须在继承层次结构的根类中指定属性 (Attribute) 和属性 (Attribute) 的属性 (Property)。我们还可以使用O/R设 计器来映射继承层次结构,它自动生成了代码。

下面为了演示下面的几 个例子,我们在O/R设计器内设计如下图所示的类及其继承关系。

我 们学习的时候还是看看其生成的代码吧!

具体设置映射继承层次结构有 如下几步:

根类添加TableAttribute属性。

为层次结构中的每个 类添加InheritanceMappingAttribute属性,同样是添加到根类中。每个 InheritanceMappingAttribute属性,定义一个Code属性和一个Type属性。Code 属性的值显示在数据库表的IsDiscriminator列中,用来指示该行数据所属的类 或子类。Type属性值指定键值所表示的类或子类。

仅在其中一个 InheritanceMappingAttribute属性上,添加一个IsDefault属性用来在数据库表 中的鉴别器值在继承映射中不与任何Code值匹配时指定回退映射。

为 ColumnAttribute属性添加一个IsDiscriminator属性来表示这是保存Code值的列 。

下面是这张图生成的代码的框架(由于生成的代码太多,我删除了很 多“枝叶”,仅仅保留了主要的框架用于指出其实质的东西):

[Table(Name = "dbo.Contacts")]
[InheritanceMapping(Code = "Unknown", Type = typeof (Contact),
          IsDefault = true)]
[InheritanceMapping(Code = "Employee", Type = typeof (EmployeeContact))]
[InheritanceMapping(Code = "Supplier", Type = typeof(SupplierContact))]
[InheritanceMapping(Code = "Customer", Type = typeof (CustomerContact))]
[InheritanceMapping(Code = "Shipper", Type = typeof(ShipperContact))]
public partial class Contact :
INotifyPropertyChanging, INotifyPropertyChanged
{
  [Column(Storage = "_ContactID",IsPrimaryKey = true,
  IsDbGenerated = true)]
  public int ContactID{ }
  [Column(Storage = "_ContactType",IsDiscriminator = true)]
  public string ContactType{ }
}
public abstract partial class FullContact : Contact{ }
public partial class EmployeeContact : FullContact{ }
public partial class SupplierContact : FullContact{ }
public partial class CustomerContact : FullContact{ }
public partial class ShipperContact : Contact{ }