【IT168技术文档】
现在的Linq To Sql只支持单表继承,不支持一实体一具体表和一实体一扩展表等方式继承。什么是单表继承呢?所谓单表继承就是把整个继承体系存储在数据库的一个表中。由此可以知道,这个表结构包括所有实体的属性字段,如果在该继承体系中,实体的数量较多,就会产生大量的null值的数据,这样浪费了很多的数据存储空间。不过所有的继承体系放在一个表中,逻辑简单容易操作,数据量不大的时候效率也高。下面看看在Linq To Sql中是怎样实现单表继承的(用Orcas白皮书中的示例来说明)。
假如现在有这样一张表Vehicle:
* Vehicle--基类,包含字段VIN、Key、MfgPlant
* Car--Vehicle的派生类,扩展字段TrimCode、ModelName
* Truck--Vehicle的派生类,扩展字段Tonnage、Axles
其中Key是用来标志该行是表示什么类型的实体,如果该行表示Vehicle,则值为"V",如果表示Car,值为"C"。
下面的示例表示该继承体系是怎样映射到数据库的表Vehicle中的(这里使用Column Attribute映射字段)
可以看到,在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)。 下面是类图:[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; }
