• 8,继承与关系


    概要:

           对于一张表,可能存在多重类型。我们可以用继承来定义它们。

           实体关系的应用,解决数据表和表之间一些复杂问题。

    内容:

          论坛主题表 dbo.Topics:

    字段名

    字段类型

    可空

    备注

    TopicID

    int

    not null

    identity/主键

    TopicTitle

    varchar(50)

    not null

     

    TopicContent

    varchar(max)

    not null

     

    ParentTopic

    int

    null

    如果帖子是主题贴这个字段为null,否则就是所属主题id

    TopicType

    tinyint

    not null

    0 – 主题贴

    1 – 回复帖

    定义实体类父类:包含都存在的部分字段。

                           然后定义可能出现的子类。

                           再定义各个类和字段的特性。

                           用[InheritanceMapping(。。)]判断类型

                           用[Column(IsDiscriminator=true)]标示判断依据

           //基类

       [Table(Name="Topics")]

       [InheritanceMapping(Code=0,Type=typeof(NewTopic),IsDefault=true)]

       [InheritanceMapping(Code=1,Type=typeof(Reply))]

       public class Topic

        {

           [Column(IsPrimaryKey=true,IsDbGenerated=true)]

           public int TopicID { get; set; }

           [Column]

           public string TopicTitle { get; set; }

           [Column]

           public string TopicContent { get; set; }

           [Column(IsDiscriminator=true)]

           public int TopicType { get; set; }

        }

       //新帖,TopicType=0,且主题字段ParentTopic为null,即不存在

       public class NewTopic : Topic

        {

           public NewTopic()

           {

               base.TopicType = 0;

           }

        }

       //回复贴,帖子类型TopicType=1,且主题字段为主题帖ID

       public class Reply : Topic

        {

           public Reply()

           {

               base.TopicType = 1;

           }

           [Column]

           public int ParentTopic { get; set; }

    }

    定义完实体类,下面就是使用方法,首先定义DataContext:

               //定义DataContext类

       public partial class BBSContext : DataContext

        {

           public Table<Topic> Topics;

           public BBSContext(string connection) : base(connection) { }

    }

    读出来Topic类,然后foreach逐行判断类型,然后再转换类型:

                   BBSContext ctx = newBBSContext("");

               var query = from c in ctx.Topics select c;

               foreach(Topic t in query )

                {

                    if (t is NewTopic)

                    {

                        NewTopic newtopic = t asNewTopic;

                        //newtopic就是可以使用的NewTopic类型

                    }

                    else if(t is Reply)

                    {

                       Reply reply = t asReply;

                        //reply就是可以使用的Reply类型

                    }

               }

    或直接使用:

           IEnumerable<NewTopic> tb = (from t inctx.Topics.OfType<NewTopic>() select t).ToList();

           Replyrpl =ctx.Topics.OfType<Reply>().Single(reply=> reply.TopicID == 8);

    实体关系的使用:

          1、  论坛版块分类表 dbo.Categories:

    字段名

    字段类型

    可空

    备注

    CategoryID

    int

    not null

    identity/主键

    CategoryName

    varchar(50)

    not null

     

    2、  论坛版块表 dbo.Boards:

    字段名

    字段类型

    可空

    备注

    BoardID

    int

    not null

    identity/主键

    BoardName

    varchar(50)

    not null

     

    BoardCategory

    int

    not null

    对应论坛版块分类表的CategoryID

    实体类:

           [Table]

       public class Categories

        {

           public Categories()

            {

                this._Boards = newEntitySet<Boards>();

            }

            private EntitySet<Boards>_Boards;

            [Association(ThisKey="Category",Storage="_Boards")]

            public EntitySet<Boards> Boards

            {

                get { return this._Boards; }

                set { this._Boards.Assign(value); }

            }

           [Column(IsPrimaryKey=true,IsDbGenerated=true)]

           public int CategoryID { get; set; }

           [Column]

           public string CategoryName { get; set; }

        }

       [Table]

       public class Boards

        {

           [Association(ThisKey="Category",Storage="_Category")]

            public Categories Category

            {

                get { return this._Category.Entity;}

                set

                {

                    this._Category.Entity = value;

                    value.Boards.Add(this );

                }

            }

            private EntityRef<Categories>_Category;

            [Column(IsPrimaryKey=true,IsDbGenerated=true)]

           public int BoardID { get; set; }

           [Column]

           public string BoardName { get; set; }

           [Column]

           public int BoardCategory { get; set; }

    }

    使用:

                  Response.Write("-------------查询分类为1的版块-------------<br/>");

           var query1 = fromb in ctx.Boards whereb.Category.CategoryID == 1 select b;

           foreach (Boardb in query1)

               Response.Write(b.BoardID + " " + b.BoardName + "<br/>");

           Response.Write("-------------查询版块大于2个的分类-------------<br/>");

           var query2 = fromc in ctx.BoardCategories where c.Boards.Count > 2 selectc;

           foreach (BoardCategoryc in query2)

               Response.Write(c.CategoryID + " " + c.CategoryName + " " +c.Boards.Count + "<br/>");

    使用:

           DataLoadOptionsoptions = new DataLoadOptions();

           options.LoadWith<BoardCategory>(c => c.Boards);

            ctx.LoadOptions = options;

           Response.Write("-------------查询版块大于2个的分类-------------<br/>");

            varquery2 = from c inctx.BoardCategories where c.Boards.Count > 2select c;

            foreach(BoardCategory c inquery2)

               Response.Write(c.CategoryID + " " + c.CategoryName + " " +c.Boards.Count + "<br/>");

    使用:

           BoardCategory dbcat= new BoardCategory(){ CategoryName = "Database" };

            Boardoracle = new Board(){ BoardName = "Oracle", Category =dbcat};

            ctx.BoardCategories.Add(dbcat);

           ctx.SubmitChanges();

      这里下载源码

  • 相关阅读:
    博客
    Windows Live Writer
    VirtualBox
    Linux dd
    Nginx与tomcat组合的简单使用
    压力测试之badboy和Jmeter的简单使用方法
    WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略
    浅谈利用SQLite存储离散瓦片的思路和实现方法
    常见ArcGIS操作(以10.0为例)
    (二十一)WebGIS中鹰眼的实现思路
  • 原文地址:https://www.cnblogs.com/yaoge/p/1816732.html
Copyright © 2020-2023  润新知