zoukankan      html  css  js  c++  java
  • 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();

      这里下载源码

  • 相关阅读:
    Canvas与Image互相转换示例以及利用该技术实现微信长按自动识别二维码功能
    chrome浏览器无法安装非应用商店插件的解决办法
    用canvas绘制android机器人
    TortoiseGit保存用户名和密码的方法
    event对象的兼容性
    利用jQuery无缝滚动插件liMarquee实现图片(链接)和文字(链接)向右无缝滚动(兼容ie7+)
    jQuery动画的hover连续触发动画bug处理
    用jquery实现平滑的页面滚动效果
    实现段落文字两端对齐的css样式
    前端构建工具gulpjs的使用介绍及技巧(转)
  • 原文地址:https://www.cnblogs.com/yaoge/p/1816732.html
Copyright © 2011-2022 走看看