[转]Linq to SQL中的实体继承

简介: 原文:http://www.cnblogs.com/blusehuang/archive/2007/07/05/807027.html    现在的Linq To Sql只支持单表继承,不支持一实体一具体表和一实体一扩展表等方式继承。
原文: http://www.cnblogs.com/blusehuang/archive/2007/07/05/807027.html

   现在的Linq To Sql只支持单表继承,不支持一实体一具体表和一实体一扩展表等方式继承。什么是单表继承呢?所谓单表继承就是把整个继承体系存储在数据库的一个表中。由此可以知道,这个表结构包括所有实体的属性字段,如果在该继承体系中,实体的数量较多,就会产生大量的null值的数据,这样浪费了很多的数据存储空间。不过所有的继承体系放在一个表中,逻辑简单容易操作,数据量不大的时候效率也高。下面看看在Linq To Sql中是怎样实现单表继承的(用Orcas白皮书中的示例来说明)。

    假如现在有这样一张表Vehicle,表结构如下:

linq1

   

   它表示了三个实体:

  • Vehicle--基类,包含字段VIN、Key、MfgPlant
  • Car--Vehicle的派生类,扩展字段TrimCode、ModelName
  • Truck--Vehicle的派生类,扩展字段Tonnage、Axles

   其中Key是用来标志该行是表示什么类型的实体,如果该行表示Vehicle,则值为"V",如果表示Car,值为"C"。

   下面的示例表示该继承体系是怎样映射到数据库的表Vehicle中的(这里使用Column Attribute映射字段)

   [Table]
[InheritanceMapping(Code = "V", Type = typeof(Vehicle),
IsDefault=true)]
[InheritanceMapping(Code = "C", Type = typeof(Car))]
[InheritanceMapping(Code = "T", Type = typeof(Truck))]
public class Vehicle
   {
[Column(IsDiscriminator = true)]
public string Key;
[Column(IsPrimaryKey = true)]
public string VIN;
[Column]
public string MfgPlant;
}
public class Car : Vehicle
   {
[Column]
public int TrimCode;
[Column]
public string ModelName;
}
public class Truck : Vehicle
   {
[Column]
public int Tonnage;
[Column]
public int Axles;
}

  可以看到,在Vehicle类上,对于在继承体系中的每个类都使用了InheritanceMapping Attribute。其中定义了Code Property,它与Vehicle类中的key字段相对应,因为Key字段用了IsDiscriminator来标志,它说明这个字段保存着映射的Code值。 Type Property表示该Code值对应哪个类型,如"V"--Vehicle, "C"--Car。 IsDefault设置为true的话,表示如果数据表中的Key值不满足其中任意一个(比如"A",不满足定义的"V","C","T"),都用该类型表示(Vehicle)。 所有子类子需要映射字段,不再需要映射数据表了(不用加上Table Attribute)。 下面是类图:

 

  我们怎样取各种实体呢?看看下面的代码:

   [Database(Name="MyDatabase")]
public class VehicleContext : DataContext
   {
......
       public Table<Vehicle> Vehicls
{
get
{
return this.GetTable<Vehicle>();
}
}
public IQueryable<Truck> Trucks
{
get {
return this.Vehicls.OfType<Truck>();
}
}
public IQueryable<Car> Cars
{
get
{
return this.Vehicls.OfType<Car>();
}
}
}

     白皮书中还举例说明了其他的方式,比如

   return this.Vehicls.Where(p => p is Car);
或者
return this.Vehicls.Select(p => p as Car).Where(p => p != null);

     只支持单表继承体系的确是很初级,不过从Linq To Sql的功能上来看,它主要强调的是从编译以及语言层面上来支持数据查询和分析,而不是强大的ORM,如果想要实体继承、支持多数据库、松散耦合,可以使用Linq To Entites或者ADO.NET Entity Framework。可以说Linq To Sql的出现给.NET编程人员带来了极大的惊喜。

目录
相关文章
|
2月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
10 0
|
7月前
|
SQL 开发框架 .NET
SQL中in和not in在LINQ中的写法
SQL中in和not in在LINQ中的写法
|
8月前
|
SQL 开发框架 .NET
ef linq方式插入+sql操作数据注意事项
ef linq方式插入+sql操作数据注意事项
65 0
|
9月前
|
SQL 数据库
SQL Server--实体再复习
前些天小编所在的组织部重构,组长交给小编一项设计实体的活儿,它是我们软件灵魂(数据)的载体,实体的抽象影响到数据库设计,数据库设计的质量影响到整个程序的运营
|
SQL 存储 开发框架
Linq To SQl总结
Linq To SQl总结
149 0
Linq To SQl总结
|
SQL 开发框架 安全
Linq to SQL中的ColumnAttribute中的Expression
在Linq to SQL中,使用ColumnAttribute特性来关联数据库和实体类。这个Atrribute也有很多属性可以设置。其中让人比较迷糊的是Expression,也折磨了我好几天才弄明白(因为官方的例子给的也让人迷糊,基本运行都无法通过)。
487 0
Linq to SQL中的ColumnAttribute中的Expression
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.9. 继承
5.9. 继承 5.9.1. 警告 PostgreSQL实现了表继承,这对数据库设计者来说是一种有用的工具(SQL:1999及其后的版本定义了一种类型继承特性,但和这里介绍的继承有很大的不同)。
1143 0
|
SQL .NET 开发框架
Linq SQL 动态个数where查询
Linq SQL 动态个数where查询,从parts表中查找工件类型ID为1、2或6...(个数不定)的所有part。
8403 0