zoukankan      html  css  js  c++  java
  • [转]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编程人员带来了极大的惊喜。

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Apicloud_(模板)登陆注册功能模板
    Apicloud_(接口验证)用户注册头部信息X-APICloud-AppKey生成
    Apicloud_(项目)网上书城02_后端数据获取
    Apicloud_(项目)网上书城01_前端搭建
    R_Studio(时序)Apriori算法寻找频繁项集的方法
    R_Studio(聚类)针对iris数据比较几种聚类方法优劣
    R_Studio(神经网络)BP神经网络算法预测销量的高低
    JavaWeb_(SSH论坛)_七、辅助模块
    JavaWeb_(SSH论坛)_六、点赞模块
    JavaWeb_(SSH论坛)_五、帖子模块
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1192262.html
Copyright © 2011-2022 走看看