精华内容
下载资源
问答
  • 关系数据库里,关系模式(模型)是型,关系是值,关系模式...关系实质上是一个二维表,表每一条记录(行)在关系模式被称为元组,每个字段()被称为属性。 前者是描述结构,后者是具体数据。严格上不能划等号。
    关系数据库里,关系模式(模型)是型,关系是值,关系模式是对关系的描述。关系实质上是一个二维表,表中每一条记录(行)在关系模式中被称为元组,每个字段(列)被称为属性。
    前者是描述结构,后者是具体数据。严格上不能划等号。
    展开全文
  • 关系与导航属性

    万次阅读 2014-05-13 13:56:44
    关系数据库,表之间的关系(也称为关联)是通过外键定义的。外键 (FK) 是用于在两个表的数据之间建立并强制链接的一组合。有三种关系类型:一对一、一对多和多对多。在一对多关系中,外键是在表示关系多端...

    本主题概述实体框架如何管理实体间的关系。还对如何映射和操作关系提供了一些指南。

     

    关系、导航属性和外键

    在关系数据库中,表之间的关系(也称为关联)是通过外键定义的。外键 (FK) 是用于在两个表的数据之间建立并强制链接的一列或列组合。有三种关系类型:一对一、一对多和多对多。在一对多关系中,外键是在表示关系多端的表上定义的。多对多关系涉及定义第三个表(也称为接合或联接表),主键由来自两个相关表的外键组成。在一对一关系中,主键还用作外键,两个表都没有单独的外键列。

    下图显示的两个表存在一对多关系。Course 表为依赖表,因为它包含 DepartmentID 列,该列链接到 Department 表。

    数据库中定义的外键约束屏幕快照

    在实体框架中,实体可以通过关联(关系)与其他实体相关。每个关系都包含两端,它们描述关系中两个实体的实体类型以及类型的多重性(一、零或一、多)。关系可由引用约束控制,该引用约束描述了关系中的哪端为 Principal Role 以及哪端为 Dependent Role。

    导航属性为在两个实体类型间导航关联提供了一种方式。针对对象参与到其中的每个关系,各对象均可以具有导航属性。使用导航属性,可以在两个方向上导航和管理关系,返回引用对象(如果多重性为一或者零或一)或集合(如果多重性为多)。也可以选择使用单向导航,在这种情况下,只对参与关系的一种而不是两种类型定义导航属性。

    建议在映射到数据库中外键的模型中包含属性。加入了外键属性,您就可以通过修改依赖对象的外键值来创建或更改关系。此类关联称为外键关联。在 N 层应用程序中,使用外键更为重要。请注意,在 1 对 1 或 1 对 0..1 关系中,没有单独的外键列,主键属性用作外键并且始终包含在模型中。

    当模型中不包含外键列时,关联信息将作为独立对象管理。关系是通过对象引用而不是外键属性跟踪的。这种关联类型称为“独立关联”。修改独立关联 的最常见方式是修改为参与关联的每个实体生成的导航属性。

    可以在您的模型中选择使用一种或两种类型的关联。不过,如果多对多关系是通过只包含外键的联接表连接的纯粹关系,EF 将使用独立关联来管理这样的多对多关系。  

    下图所示为使用实体框架设计器创建的概念模型。该模型包含两个参与一对多关系的实体。这两个实体都有导航属性。Course 为依赖实体,它定义了 DepartmentID 外键属性。

    EF 设计器中定义的关系屏幕快照

     

    下图所示为使用 Code First 创建的相同模型。

    使用 Code First 定义的关系屏幕快照

     

    配置/映射关系

    本页面的其余部分介绍如何使用关系访问和操作数据。有关在模型中如何设置关系的信息,请参见以下页面。

     

    创建和修改关系

    外键关联 中,更改关系时,具有 EntityState.Unchanged 状态的依赖对象的状态会改为 EntityState.Modified。在独立关系中,更改关系不会更新依赖对象的状态。

    下面的示例演示如何使用外键属性和导航属性关联相关对象。使用外键关联时可以使用任一种方法更改、创建或修改关系。使用独立关联,则不能使用外键属性。

    • 通过为外键属性指定新值,如下例所示。

      course.DepartmentID = newCourse.DepartmentID;

     

    • 下面的代码通过将外键设置为 null 删除了关系。请注意,外键属性必须不可为 Null。

      course.DepartmentID = null;

      注意:如果引用处于已添加状态(在本例中为 course 对象),在调用 SaveChanges 之前,引用导航属性将不与新对象的键值同步。由于对象上下文在键值保存前不包含已添加对象的永久键,因此不发生同步。如果必须在设置关系时使新对象完全同步,请使用以下方法中的一种。

     

    • 通过将一个新对象分配给导航属性。下面的代码在 course 和 department 之间创建关系。如果对象附加到上下文,course 也会添加到 department.Courses 集合中,course 对象的相应的外键属性设置为 department 的键属性值。

      course.Department = department;

     

    • 要删除该关系,请将导航属性设置为 null。如果使用的是基于 .NET 4.0 的实体框架,则需要先加载相关端,然后再将其设置为 Null。例如:

      context.Entry(course).Reference(c => c.Department).Load();
      course.Department = null;


      从实体框架 5.0(它基于 .NET 4.5)开始,不必加载相关端就可以将关系设置为 Null。也可以使用以下方法将当前值设置为 Null。

      context.Entry(course).Reference(c => c.Department).CurrentValue = null;

     

    • 通过在实体集合中删除或添加对象。例如,可以将 Course 类型的对象添加到 department.Courses 集合中。此操作将在特定 course 和特定 department 之间创建关系。如果对象附加到上下文,course 对象的 department 引用和外键属性将设置为相应的 department

      department.Courses.Add(newCourse);

     

    • 通过使用 ChangeRelationshipState 方法更改两个实体对象间指定关系的状态。此方法是处理 N 层应用程序和独立关联 时最常用的方法(不能用于外键关联)。此外,要使用此方法,必须下拉到 ObjectContext,如下例所示。

      在下面的示例中,Instructor 和 Course 之间存在多对多关系。调用 ChangeRelationshipState 方法并传递 EntityState.Added 参数,使 SchoolContext 知道在这两个对象间添加了关系。

             ((IObjectContextAdapter)context).ObjectContext.
                       ObjectStateManager.
                        ChangeRelationshipState(course, instructor, c => c.Instructor, EntityState.Added);
         

      请注意,如果是更新(而不仅是添加)关系,添加新关系后必须删除旧关系:

             ((IObjectContextAdapter)context).ObjectContext.
                        ObjectStateManager.
                        ChangeRelationshipState(course, oldInstructor, c => c.Instructor, EntityState.Deleted);    

     

    同步 FK 和导航属性之间的更改

    使用上述方法中的一种更改附加到上下文的对象的关系时,实体框架需要保持外键、引用和集合同步。实体框架使用代理自动管理 POCO 实体的这种同步(也称为关系修复)。有关更多信息,请参见 使用代理

    如果不通过代理使用 POCO 实体,则必须确保调用 DetectChanges 方法同步上下文中的相关对象。请注意,下面的 API 会自动触发 DetectChanges 调用。

    • DbSet.Add
    • DbSet.Find
    • DbSet.Remove
    • DbSet.Local
    • DbContext.SaveChanges
    • DbSet.Attach
    • DbContext.GetValidationErrors
    • DbContext.Entry
    • DbChangeTracker.Entries
    • 对 DbSet 执行 LINQ 查询

     

    加载相关对象

    在实体框架中,一般使用导航属性加载与定义的关联返回的实体相关的实体。有关更多信息,请参见 加载相关对象

    注意:在外键关联中,加载依赖对象的相关端时,将根据内存中当前的相关外键值加载相关对象:

    // Get the course where currently DepartmentID = 1. 
    Course course2 = context.Courses.First(c=>c.DepartmentID == 2); 
     
    // Use DepartmentID foreign key property  
    // to change the association. 
    course2.DepartmentID = 3; 
     
    // Load the related Department where DepartmentID = 3 
    context.Entry(course).Reference(c => c.Department).Load();

    在独立关联中,基于当前数据库中的外键值查询依赖对象的相关端。不过,如果修改了关系,并且依赖对象的引用属性指向对象上下文中加载的不同主对象,实体框架将尝试创建关系,就像它在客户端定义的那样。

     

    展开全文
  • 关系数据库,表之间的关系(也称为关联)是通过外键定义的。外键 (FK) 是用于在两个表的数据之间建立并强制链接的一组合。有三种关系类型:一对一、一对多和多对多。在一对多关系中,外键是在表示关系多端...

    本主题概述实体框架如何管理实体间的关系。还对如何映射和操作关系提供了一些指南。

    关系、导航属性和外键

    在关系数据库中,表之间的关系(也称为关联)是通过外键定义的。外键 (FK) 是用于在两个表的数据之间建立并强制链接的一列或列组合。有三种关系类型:一对一、一对多和多对多。在一对多关系中,外键是在表示关系多端的表上定义的。多对多关系涉及定义第三个表(也称为接合或联接表),主键由来自两个相关表的外键组成。在一对一关系中,主键还用作外键,两个表都没有单独的外键列。

    下图显示的两个表存在一对多关系。Course 表为依赖表,因为它包含 DepartmentID 列,该列链接到 Department 表。

    数据库中定义的外键约束屏幕快照

    在实体框架中,实体可以通过关联(关系)与其他实体相关。每个关系都包含两端,它们描述关系中两个实体的实体类型以及类型的多重性(一、零或一、多)。关系可由引用约束控制,该引用约束描述了关系中的哪端为 Principal Role 以及哪端为 Dependent Role。

    导航属性为在两个实体类型间导航关联提供了一种方式。针对对象参与到其中的每个关系,各对象均可以具有导航属性。使用导航属性,可以在两个方向上导航和管理关系,返回引用对象(如果多重性为一或者零或一)或集合(如果多重性为多)。也可以选择使用单向导航,在这种情况下,只对参与关系的一种而不是两种类型定义导航属性。

    建议在映射到数据库中外键的模型中包含属性。加入了外键属性,您就可以通过修改依赖对象的外键值来创建或更改关系。此类关联称为外键关联。在 N 层应用程序中,使用外键更为重要。请注意,在 1 对 1 或 1 对 0..1 关系中,没有单独的外键列,主键属性用作外键并且始终包含在模型中。

    当模型中不包含外键列时,关联信息将作为独立对象管理。关系是通过对象引用而不是外键属性跟踪的。这种关联类型称为“独立关联”。修改独立关联 的最常见方式是修改为参与关联的每个实体生成的导航属性。

    可以在您的模型中选择使用一种或两种类型的关联。不过,如果多对多关系是通过只包含外键的联接表连接的纯粹关系,EF 将使用独立关联来管理这样的多对多关系。  

    下图所示为使用实体框架设计器创建的概念模型。该模型包含两个参与一对多关系的实体。这两个实体都有导航属性。Course 为依赖实体,它定义了 DepartmentID 外键属性。

    EF 设计器中定义的关系屏幕快照

     

    下图所示为使用 Code First 创建的相同模型。

    使用 Code First 定义的关系屏幕快照

     

    配置/映射关系

    本页面的其余部分介绍如何使用关系访问和操作数据。有关在模型中如何设置关系的信息,请参见以下页面。

     

    创建和修改关系

    外键关联 中,更改关系时,具有 EntityState.Unchanged 状态的依赖对象的状态会改为 EntityState.Modified。在独立关系中,更改关系不会更新依赖对象的状态。

    下面的示例演示如何使用外键属性和导航属性关联相关对象。使用外键关联时可以使用任一种方法更改、创建或修改关系。使用独立关联,则不能使用外键属性。

    • 通过为外键属性指定新值,如下例所示。

      course.DepartmentID = newCourse.DepartmentID;

     

    • 下面的代码通过将外键设置为 null 删除了关系。请注意,外键属性必须不可为 Null。

      course.DepartmentID = null;

      注意:如果引用处于已添加状态(在本例中为 course 对象),在调用 SaveChanges 之前,引用导航属性将不与新对象的键值同步。由于对象上下文在键值保存前不包含已添加对象的永久键,因此不发生同步。如果必须在设置关系时使新对象完全同步,请使用以下方法中的一种。

     

    • 通过将一个新对象分配给导航属性。下面的代码在 course 和 department 之间创建关系。如果对象附加到上下文,course 也会添加到 department.Courses 集合中,course 对象的相应的外键属性设置为 department 的键属性值。

      course.Department = department;

     

    • 要删除该关系,请将导航属性设置为 null。如果使用的是基于 .NET 4.0 的实体框架,则需要先加载相关端,然后再将其设置为 Null。例如:

      context.Entry(course).Reference(c => c.Department).Load();
      course.Department = null;


      从实体框架 5.0(它基于 .NET 4.5)开始,不必加载相关端就可以将关系设置为 Null。也可以使用以下方法将当前值设置为 Null。

      context.Entry(course).Reference(c => c.Department).CurrentValue = null;

     

    • 通过在实体集合中删除或添加对象。例如,可以将 Course 类型的对象添加到 department.Courses 集合中。此操作将在特定 course 和特定 department 之间创建关系。如果对象附加到上下文,course 对象的 department 引用和外键属性将设置为相应的 department

      department.Courses.Add(newCourse);

     

    • 通过使用 ChangeRelationshipState 方法更改两个实体对象间指定关系的状态。此方法是处理 N 层应用程序和独立关联 时最常用的方法(不能用于外键关联)。此外,要使用此方法,必须下拉到 ObjectContext,如下例所示。

      在下面的示例中,Instructor 和 Course 之间存在多对多关系。调用 ChangeRelationshipState 方法并传递 EntityState.Added 参数,使 SchoolContext 知道在这两个对象间添加了关系。

             ((IObjectContextAdapter)context).ObjectContext.
                       ObjectStateManager.
                        ChangeRelationshipState(course, instructor, c => c.Instructor, EntityState.Added);
         

      请注意,如果是更新(而不仅是添加)关系,添加新关系后必须删除旧关系:

             ((IObjectContextAdapter)context).ObjectContext.
                        ObjectStateManager.
                        ChangeRelationshipState(course, oldInstructor, c => c.Instructor, EntityState.Deleted);    

     

    同步 FK 和导航属性之间的更改

    使用上述方法中的一种更改附加到上下文的对象的关系时,实体框架需要保持外键、引用和集合同步。实体框架使用代理自动管理 POCO 实体的这种同步(也称为关系修复)。有关更多信息,请参见使用代理

    如果不通过代理使用 POCO 实体,则必须确保调用 DetectChanges 方法同步上下文中的相关对象。请注意,下面的 API 会自动触发 DetectChanges 调用。

    • DbSet.Add
    • DbSet.Find
    • DbSet.Remove
    • DbSet.Local
    • DbContext.SaveChanges
    • DbSet.Attach
    • DbContext.GetValidationErrors
    • DbContext.Entry
    • DbChangeTracker.Entries
    • 对 DbSet 执行 LINQ 查询

     

    加载相关对象

    在实体框架中,一般使用导航属性加载与定义的关联返回的实体相关的实体。有关更多信息,请参见加载相关对象

    注意:在外键关联中,加载依赖对象的相关端时,将根据内存中当前的相关外键值加载相关对象:

    // Get the course where currently DepartmentID = 1. 
    Course course2 = context.Courses.First(c=>c.DepartmentID == 2); 
     
    // Use DepartmentID foreign key property  
    // to change the association. 
    course2.DepartmentID = 3; 
     
    // Load the related Department where DepartmentID = 3 
    context.Entry(course).Reference(c => c.Department).Load();

    在独立关联中,基于当前数据库中的外键值查询依赖对象的相关端。不过,如果修改了关系,并且依赖对象的引用属性指向对象上下文中加载的不同主对象,实体框架将尝试创建关系,就像它在客户端定义的那样。

     

    管理并发

    在外键和独立关联中,并发检查都是基于实体键和模型中定义的其他实体属性的。使用 EF 设计器创建模型时,将 ConcurrencyMode 特性设置为 fixed 可指定应对该属性进行并发检查。使用 Code First 定义模型时,应对要进行并发检查的属性使用 ConcurrencyCheck 注释。使用 Code First 时,也可以使用 TimeStamp 注释指定应对属性进行并发检查。一个给定类中只能有一个时间戳属性。Code First 将此属性映射到数据库中一个不可为 Null 的字段。

    建议始终使用外键关联处理参与并发检查和解析的实体。

    有关更多信息,请参见开放式并发模式

     

    使用重叠键

    重叠键是指键中某些属性亦是实体中其他键的一部分的那些组合键。在独立关联中不能包含重叠键。若要更改包含重叠键的外键关联,我们建议您修改外键值而不要使用对象引用。

    说明:本文转自 Developer Network 在此学习方便以后查看,并分享给大家

    展开全文
  • Window 窗口层次关系 相信在Window 下面编程的很多兄弟们都不是很清楚Window 窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说...


      Window 窗口层次关系
      相信在Window 下面编程的很多兄弟们都不是很清楚Window 中窗口的层次关系是怎么样的,这个东西很久已经研究过一下,后来又忘记了,今天又一次遇到了这个问题,所以便整理一下。下面就说说Window 中桌面(Deskkop)以及顶层窗口,以及子窗口之间的关系。
      
      在Window 的图形界面下,最基本显示信息的元素就是窗口,每一个Window 窗口都管理着自己与其他窗口之间的关系和自身的一些信息,如:是否可见,窗口的所有者,窗口的父/子关系等等信息,当窗口创建、销毁、显示的时候,就会用到这些信息。
      
      在每一个窗口实例中,有四个元素被窗口管理器用来建立窗口管理链表。
      
      
     

      
      Child : 指向窗口子窗口的句柄
      Parent: 指向窗口父窗口的句柄
      Owner: 指向窗口所有者的句柄
      Next:  指向下一个同属窗口的句柄
      
      众所周知当Window 初始化的时候,它创建桌面这个窗口,桌面覆盖着整个窗口,窗口管理器用这个窗口作为窗口链表中第一个元素。因此桌面在窗口的层次关系中在最上层。
      
      在窗口层次关系中,桌面窗口下一层窗口叫做顶层窗口,顶层窗口就是那些不是子窗口的窗口,顶层窗口不能够有WS_CHILD 属性。窗口管理器是如何把桌面窗口和顶层窗口联系起来的呢?窗口管理器把顶层窗口都组织到一个链表中,而这个链表的头存储的就是桌面窗口的子窗口句柄,每一个子窗口通过Next 就可以找到链表中下一个窗口了。这个链表被称为子窗口链表,在同一个子窗口链表中的窗口是互为同属窗口,所有顶层窗口都是同属窗口。窗口在子窗口链表中的次序,也表明了窗口距离距离桌面窗口的距离。顶层窗口所形成的子窗口链表构成了一个Z 轴,窗口管理器就是根据Z 序列来觉得窗口的哪一部分是显示的,哪一部分是被遮盖的。
      
      所有顶层窗口的父窗口都是指向桌面窗口的,这样一来顶层窗口就好像是桌面窗口的子窗口,所有顶层窗口构成的链表是桌面窗口的子窗口链表。当顶层窗口创建的时候,窗口管理器把顶层窗口放在Z 轴的顶上,这样使得整个窗口可见,窗口管理器把窗口插入到桌面窗口子窗口链表的前面。WS_EX_TOPMOST 这个属性控制着窗口管理器创建顶层窗口,窗口管理器把没有WS_EX_TOPMOST 属性的窗口放在具有WS_EX_TOPMOST 属性的窗口的后面,这样就使得具有WS_EX_TOPMOST 属性的窗口一直显示在前面。
      
      
     

      
      在顶层窗口之间还有另外一直关系,拥有或者属于其他的顶层窗口,属于其他窗口的窗口叫做归属窗口,拥有其他窗口叫做宿主窗口,在Z 轴中,归属窗口一定在他的宿主窗口的前面,如果一个宿主窗口最小化,那么归属他的窗口会隐藏掉,如果宿主窗口隐藏起来,归属他的窗口不会被隐藏掉。如果有三个窗口A、B、C ,A 拥有 B,B 拥有 C ,如果A 最小化,那么B 会隐藏,但是 C 还是可见的。怎么才能够在窗口之间建立所有关系呢?方法是在调用CreateWindow或者CreateWindowEx 创建窗口的时候,指定hwndParent 参数。
      
      
     

      
      桌面窗口是在窗口层次中的第一层,顶层窗口在窗口层次中的第二层,子窗口也就是那些创建的时候指定了WS_CHILD 属性的窗口占据了窗口层次的其他层。窗口和子窗口之间的联系,就像桌面窗口和顶层窗口之间的关系一样。
      
      

      
      户区域,所有同一个窗口的子窗口同样建立一个Z 轴,这个和顶层窗口是类似的,顶层窗口也是显示在其父窗口――桌面窗口的客户区域。
      
      16 位和32 位窗口系统的区别
      窗口之间的父子关系、归属所有关系、以及根据 Z 轴来显示的这些规则在16 位和32 位窗口系统中都是相同的。这样可以是在两种窗口系统中高度的兼容。两种窗口系统的区别在于安全和多线程。
      
      Window Nt 在原有的窗口层次关系中多增加了一层,每一个运行着Window NT 的系统中都有一个Window 工作站对象,这个对象是安全对象的第一层,是所有用户安全对象的继承之源,每一个Window 工作站对象可以拥有一些桌面对象,每一个桌面都拥有上面描述的那样的窗口关系。Window Nt 用了两个桌面窗口对象,一个是用来处理登陆界面、屏蔽、锁住工作站等,一个是我们登陆之后进来操作的窗口了。J 通常用户是不能够创建和删除桌面的,不过那是通常,实际上在Window 下面也可以实现类似 Linux 中的多个桌面的效果,每一个桌面都是一个独立的世界。
      
      两种窗口系统还有两位一个区别,在16 位窗口系统中不支持多线程,所以应用程序开发者在创建窗口的时候不必考虑线程的问题了。而在32 位窗口系统中由于又支持了窗口的父子关系,归属与拥有关系,同一个窗口下面的所有线程都拥有相同的一个输入队列,应用程序开发者应该明白输入队列是共享的,在同一个时刻只能有一个线程处理消息,其他的线程都在等待输入队列一直到GetMessage 或者PeekMessage 返回,而且必须注意的是父窗口和子窗口或者是归属与拥有窗口共用同一个线程。
      
      在32 窗口系统中定义两种新的窗口类型,前台窗口和背景窗口,这两种窗口没有列到窗口的层次关系中,前台窗口就是用户当前操作的窗口,其他的所有窗口都是背景窗口。 32 位窗口系统中支持两个函数来处理前台窗口SetForegroundWindow 和GetForegroundWindow。
      
      操作窗口列表
      下面是窗口列表操作的一些函数:
      
      EnumChildWindows
      
      使用这个函数得到一个窗口的所有子窗口,包括子窗口的子窗口。不过在列举的过程中这个函数不能够列出正在创建的或者销毁的窗口。
      
      EnumThreadWindows
      
      使用这个函数可以列出所有属于这个线程的窗口。在这个函数调用之后创建的窗口是不能够被列举出来的。
      
      EnumWindows
      
      使用这个函数列举出所有顶层窗口,不能够列举出子窗口,要列出所有的顶层窗口,使用这个函数比GetWindow安全。使用GetWindow 来列出所有的窗口,可能会导致程序无限循环,因为在调用GetWindow 的过程中,可能一些窗口已经销毁了。EnumWindows 不能够列举出调用这个函数之后创建的顶层窗口。
      
      FindWindow
      
      可以使用这个函数通过类名或者使用窗口的标题来找到顶层窗口,这个函数不能够用来找子窗口,这个函数不区分参数的大小写。这个函数在Z轴中寻找窗口,找到了之后,就会返回。
      
      GetDesktopWindow
      
      得到桌面窗口句柄
      
      GetNextWindow
      
      使用这个函数得到这个窗口的同属窗口,在16 位窗口系统中GetNextWindow 和GetWindow 是两个不同的函数,在32 位系统中这个函数是通过GetWindow 来实现的。
      
      GetParent
      
      如果一个窗口存在父窗口,那么可以通过这个函数得到窗口的父窗口,如果窗口是顶层窗口,则返回其所有者窗口句柄。
      
      GetThreadDesktop
      
      这个函数用来得到指定线程的所属的桌面窗口句柄,在win95 和 win98 下面由于不支持多桌面,每次调用该函数都返回同一个值。
      
      GetTopWindow
      
      可以用这个函数来得到给定窗口的第一个子窗口的句柄,如果传递给函数的参数是NULL 的话,那么这个函数将会返回最上面的顶层窗口。
      
      GetWindow
      
      应用程序可以调用这个函数来在窗口列表中导航,这个函数有两个参数,一个是窗口的句柄,另外是要得到的窗口句柄和这个窗口之间的关系。
      
      · GW_HWNDNEXT: 这个函数返回给定窗口的下一个同属窗口
      
      · GW_HWNDFIRST: 返回给定窗口的前一个同属窗口
      
      · GW_HWNDLAST: 返回给定窗口的最后一个同属窗口
      
      · GW_HWNDPREV: 返回给定窗口的第一个同属窗口
      
      · GW_OWNER: 返回给定窗口的所有者窗口句柄
      
      · GW_CHILD: 返回给定窗口的第一个子窗口句柄
      
      IsChild
      这个函数有两个参数,两个窗口句柄,判断两个窗口是否存在父子关系
      
      窗口的属性
      当应用程序调用CreateWindow 创建窗口的时候,我们必须为窗口指定属性,下面简要的介绍一下窗口的属性。
      
      WS_OVERLAPPED
      交迭属性是顶层窗口的一种属性,使用这种属性创建的窗口,会被链接到桌面窗口的子窗口链表中,应用程序通常使用这种属性的窗口作为应用程序的主窗口,具有交迭属性的窗口通常具有有标题栏,即使是WS_CAPTION 这个属性没有指定。具有交迭属性的窗口通常都是有边框的,具有交迭属性的窗口可以拥有自己的顶层窗口,也可以所属其他的顶层窗口,所有的这类窗口都具有WS_CLIPSIBLINGS 属性,即使是没有给窗口指定这个属性。
      
      WS_POPUP
      弹出属性也是应用到顶层窗口的一种属性,使用这种属性创建的窗口会被链接到桌面窗口的子窗口链表中,应用程序通常为对话框窗口设置这个属性,弹出属性和交迭属性的主要区别在于具有弹出属性的窗口不是一定要有标题栏的,而具有交迭属性的窗口则是一定要具有标题栏,具有弹出属性的窗口可以没有边框。和具有交迭属性的窗口一样,具有弹出属性的窗口可以有自己的顶层所属窗口,也可以所属其他的顶层窗口。所有具有弹出属性的窗口必须具有WS_CLIPSIBINGS 属性,即使是用户没有指定这个属性。具有弹出属性的窗口在创建的时候,它的大小和位置不能够使用CW_USEDEFAULT 值。
      
      WS_CHILD
    子窗口必须具有这个属性,子窗口只能够出现在父窗口的客户区域,这是子窗口和具有交迭属性的窗口以及弹出属性的窗口的主要区别,创建子窗口的时候,位置和大小不能够使用CW_USEDEFAULT这个值,否则是不能够创建窗口的。

    WS_CAPTION

     

     当窗口被设置这个属性的时候,窗口的最上头会有标题栏,应用程序可以通过SetWindowText这个函数来改变标题栏的标题,通常具有标题栏的窗口还具有最大、最小、关闭按钮,和系统菜单。如果一个窗口没有标题栏,那么Window是不会创建这些东西的,即使是用户指定了这些属性,系统菜单是依赖标题栏窗口的存在而存在的,如果没有标题栏那么是一定不会有系统菜单的存在的。具有标题栏的窗口通常具有单线的边界具有可以改变窗口大小的属性,通常具有标题栏的窗口是不能具有对话框的边界属性的,除非为窗口设置WS_EX_DLGMODALFRAME属性。 WS_MINIMIZEBOX

     

    当为窗口设置这个属性的时候,窗口的标题栏上会有一个最小化的按钮,其实对于Window来实现这个属性的时候,只是在标题栏上面放置了一个最小化的位图,当用户点击这个最小化位图的时候,窗口最小化,如果最大化位图最在,那么最小化位图被放置在最大化位图的左边。没有这个属性的窗口是不能够最小化的。

    WS_MAXIMIZEBOX

     

    当为窗口设置这个属性的时候,窗口的标题栏的右上会被放置一个最大化的位图,如果窗口设置了这个属性,用户可以点击最大化的位图或者是通过系统菜单来实现窗口的最大化,没有这个属性的窗口是不能够被最大化的。

    WS_SYSMENU

     

    如果为窗口指定这个属性,那么就会在窗口的左上角上放置系统菜单位图,系统菜单为用户提供了操作窗口的接口,通常系统菜单会有下面这些系统命令:

    恢复最小化的窗口使用键盘移动窗口使用键盘改变窗口的大小最小化窗口最大化窗口关闭窗口切换到其他的任务

    •  
    如果一个窗口有系统菜单,用户可以通过点击系统菜单图标来调用系统菜单,或者通过Alt+空格的快捷键调出系统菜单,或者通过点击任务栏上窗口的图标来调出系统菜单,如果一个窗口没有系统菜单,那么用户不能够通过键盘来实现系统命令,除非应用程序自身提供了这样的接口。系统菜单对于最大化的窗口也是很有用处的,最大化的窗口覆盖了整个屏幕,这样的窗口不能够被移动,除非恢复到不是最大化的状态,如果这个最大化的窗口有了系统菜单,则就不必一定恢复到非最大化的状态才能够移动。

    WS_HSCROLL

     

    如果窗口被指定了这个属性,那么窗口会有一个水平的滚动条,窗口是不会自动的滚动滚动条的,如果应用程序要支持滚动条,那么必须自己处理WM_HSCROLL消息,这个属性通常是在窗口创建的时候,被指定的。 

    WS_VSCROLL

     

    如果窗口被指定了这个属性,那么窗口会有一个竖直的滚动条,窗口不会自动的滚动滚动条,应用程序必须自己处理WM_VSCROOL消息来处理滚动条滚动的消息,这个属性通常是在窗口被创建的时候指定的。

    WS_BORDER

     

    如果窗口被指定了这个属性,那么窗口会有一个单线的边在窗口的周围,如果没有指定这个属性,但是窗口具有标题栏,那么窗口会自动的拥有这个属性,如果窗口没有这个属性,拥有这个属性的窗口不能够通过键盘或者是鼠标改变窗口的大小。

    WS_DLGFRAME

     

    如果窗口被指定了这个属性,那么窗口具有对话框的边框,这个属性通常是用在对话框窗口的,只能够用在窗口没有标题栏的情况下,如果一个不是对话框的窗口使用了这个窗口,那么窗口必须被指定WS_EX_DLGMODALFRAME属性。使用这个属性创建的窗口,不能够通过键盘和鼠标改变窗口的大小。

    WS_THICKFRAME

     

    当窗口被指定了这个属性,那么窗口会有一个可以改变大小的边框,这种属性通常用在程序的主窗口,具有这种属性的窗口的大小可以通过键盘或者鼠标来改变。

    WS_CLIPCHILDREN

     

    这个属性用在具有子窗口的窗口,使用这个属性,可以使Window把子窗口所占的区域拷贝到父窗口,而不是甴父窗口直接的画子窗口所属的区域,如果窗口没有指定这个属性,那么那么父窗口会覆盖子窗口的区域。在一些图片显示或者OpenGL显示的窗口中,指定这个属性是很重要的。

    WS_CLIPSIBLINGS

     

    当窗口赋予这个属性,窗口在自绘的时候,不会绘制到同属的子窗口,所有具有交迭属性和弹出属性的窗口都具有这个属性,所有的顶层窗口都具有这个属性,这样一来顶层窗口在自绘的时候,不会绘制在到其他的顶层窗口。 

    WS_VISIBLE

     

    当窗口被设置这个属性的时候,窗口是可见的,默认的情况下,应用程序必须自己调用ShowWindow来显示窗口。

    WS_DISABLED

     

    当窗口被设置这个属性的时候,创建的窗口不能够接受用户的输入,除非应用程序自身提供方法来输入。这个属性通常用在Window控件上面。

    WS_CHILDWINDOW

     

    这个属性同WS_CHILD。

    WS_OVERLAPPEDWINDOW

     

    这个属性同WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,这个属性通常用在应用程序的主窗口。

    WS_POPUPWINDOW

     

    这个属性同WS_POPUP|WS_BORDER|WS_SYSMENU,尽管这个属性中包含了WS_SYSMENU属性,如果窗口没有WS_CAPTION属性,那么窗口也不会有系统菜单。

    WS_EX_DLGMODALFRAME

     

    当窗口设置了这个属性的时候,窗口具有对话框的边框,这个属性通常用在对话框窗口,不过任何窗口都可以使用这个属性来获得对话框的边框。

    WS_EX_NOPARENTNOTIFY

     

    这个属性是用在子窗口上的,当子窗口设置了这个属性,Window不发送WM_NOTIFY消息给子窗口的父窗口,默认情况下,Window会在子窗口创建或者销毁的时候发送WM_NOTIFY消息给子窗口的父窗口。WS_EX_TOPMOST

     

    这个属性仅用在顶层窗口,对于子窗口设置这个属性是被忽略的,如果窗口设置了这个属性,那么窗口会一直在其他窗口的上面。

    WS_EX_ACCEPTFILES

     

    窗口设置了这个属性,那么窗口可以接受拖放的对象。

    WS_EX_TRANSPARENT

     

    这个属性能够使窗口透明,设置了这个属性的窗口的背景使可以被看到的,透明窗口对于鼠标和键盘的消息事件并不是透明的
     
    展开全文
  • 关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域,每一列称为一个属性,不同的属性要给予不同的属性关系分三类:基本表(基本关系)、查询表、视图表 其中基本表有如下性质: ① 列是同质的 ②...
  • 在 SQL 数据库,生成(Generated Column)是指由表其他字段计算得到的,因此也称为计算(Computed Column)。 本文介绍各种主流数据库对于生成/计算的实现,包括 Oracle、MySQL、SQL Server、...
  • 的一即为一个属性,给每一个属性起一个名称,即属性名 4)码(键) 码是数据系统的基本概念。所谓码就是能唯一标识实体的属性,他是整个实体集的性质,而不是单个实体的性质。它包括超码,候选码,主码。 ...
  •  由n个域笛卡尔积(即从每个域抽取作为元组的一个分量)的子集组成的一张2维表称为关系。由于并非所有元组都有意义,所以只有那些有意义的元组的集合才是关系。  关系有3个属性:a、关系名(表名) b、属性列表...
  • 列属性称为字段属性. 在mysql一共有6个属性:null,默认值,描述,主键,唯一键和自增长. NULL属性 NULL属性代表字段为空. 如果对应的值为yes表示该字段允许为null, 注意: 1. 设计表的时候尽量不要让数据为...
  • 四、字段、记录、表的关系 五、 六、行 七、属性 八、元组 九、主键 十、外键 零、码仙励志 坚持和放弃,都不会绝对正确。最恨不过一句,逼不得已。最大大不过一句,老子乐意 一、字段 一个事物的某一个...
  • Web API 2支持一个新的路由类型,它被称为属性路由。正如其名,属性路由使用属性来定义路由。属性路由给予你在web API的URI上的更多控制。例如,你能轻易的创建用于描述层级资源的URI。早期的路由风格被称为基于约定...
  • 在Qt Designer,提供了八大类可视化组件(也称为组件或控件,下同),分别为布局组件(Layouts)、分隔组件(Spacers)、按钮组件(Buttons)、表项视图(item views)、表项组件(item widg...
  • 数据库 - 关系代数与关系运算

    千次阅读 2015-05-05 09:12:58
    具有相同的目n(即两个关系都有n个属性) 相应的属性取自同一个域R∪S 仍为n目关系,由属于R或属于S的元组组成 R∪S = { t|t  R∨t S } 差(Difference)R和S 具有相同的目n 相应的属性取自同一个域R - S 仍...
  • 关系模型的一些关键字的定义

    千次阅读 2017-06-08 21:43:03
    属性(Attribute):表的一即为一个属性,给每一个属性起一个名称即属性名。码(Key):也称为码键。表的某个属性组,它可以唯一确定一个元组。域(Domain):属性的取值范围。分量:元组的一个属性值。关系模型:对...
  • 通俗理解主属性,范式!

    千次阅读 2018-12-27 19:29:57
    概括来说,就是,只要是可以用某一或者多能够推出关系的所有的,这个时候,那个某一或多就是一个候选码,所有候选码的所有属性列都称为属性。 何为1NF? 所有属性都是不可分的! 何为2NF? 所有...
  • 当前数据库分为关系型数据库和非关系型数据库 关系型数据库 关系型数据库:指采用了关系模型来组织数据的数据库。 关系模型指的就是二维表格模型...属性:二维表的一,在数据库称为字段 域:属性的取值范...
  • ❤️ 关系数据结构及形式化定义 1.笛卡尔积:当做一个表来说,就是一行是一个元组,一是一个域,是域的基数的相乘 2.关系:一张规范的二维表 ...7.候选码:关系中的某一属性组的值能唯一地标识一个元组,而子集...
  • 关系型数据库与NoSQL数据库简述

    千次阅读 2017-09-21 16:10:44
    关系:可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名元组:可以理解为二维表的一行,在数据库经常被称为记录属性:可以理解为二维表的一,在数据库经常被称为字段域:属性的取值范围...
  • 上回 说了 Hibernate的单向一对多关联 和 Hibernate的单向多对一关联...如:学生与班级的关系。  在Grade类需要添加 Set集合保存Student对象,并且在Grade.hbm.xml的映射配置文件,针对Set集合添加如下配置:
  • 关系数据模型

    千次阅读 2019-08-14 10:40:01
    一、数据结构  关系数据模型是有若干个关系模式组成的集合。关系模式的实例成为关系。每个关系可看为一个二维表,表的行...表的列称为属性,列名即为属性名,属性名不能相同。 关系的描述...
  • 关系模式的各种码(键/关键字)

    千次阅读 2021-03-15 21:02:18
    码,又称键、关键字,英文是key。唯一标识实体的属性称为码。 ...全码:一个候选码包含关系模式的所有属性,则该候选码为全码 举个例子: 关系Student(学号,姓名,年龄,院系,班级)...
  • 属性:表的一列称为关系的一个属性 属性域:每一个属性都有一个取值范围,称为属性域 超键:凡是能够唯一标识一个元组的属性或属性组,均称为超键 候选键:候选键是最小的超键,它的任意真子集都不能成为超键 主键...
  • 关系数据库——关系数据语言

    千次阅读 多人点赞 2019-10-22 19:52:51
    关系 域:一组具有相同数据类型的值的集合(即取值范围) 笛卡尔积:域上的一种集合运算。结果为一个集合,集合的每一个元素是一个元组,元组的每一个分量来自不同的域。...(即数,属性的数目),注意...
  • Python如何获取类属性的列表

    千次阅读 2018-01-16 10:42:00
    这篇文章主要给大家介绍了在Python如何获取类属性的列表,文中通过示例代码介绍的很详细,相信对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。 前言 最近工作遇到...
  • 在上一篇文章我们学习了WindowManager体系,了解了Window和WindowManager之间的关系,这一篇我们接着来学习Window的属性
  • 关系模型名词解释 (1)关系模型:用二维表格结构表示实体集,外键表示实体间联系的数据模型称为关系模型。 (2)关系模式:关系模式实际上就是记录类型。它的定义包括:模式名,属性...在关系模型,字段称为属性。...
  • 1.候选码的定义:如果关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码; 2.主码的定义:如果一个关系有多个候选码,则选定其中一个为主码; 3.主属性定义:候选码的诸属性称为属性; 4.非主...
  • 关系中的一个属性属性组的值能够唯一地标识一个元组,且他的真子集不能唯一的标识一个元组,则称这个属性属性组做候选码。 2、主码:主码指主关键字。主关键字(primary key)是表的一个或多个字段,它的值...
  • 关系数据模型相关概念

    千次阅读 2018-01-29 17:51:21
    域:每个属性的取值集合称为属性的域。属性值必须是原子的,即不可分割的(如多值属性值、复合属性值不是原子的) 特殊值null是每一个域的成员。 2、关系型数据库常用概念:冗余(本不应存在却存在了
  • 式数据库简介

    千次阅读 2020-06-26 21:13:35
    关系数据库管理系统(RDBMS)将行的数据和数据属性存储为标题。基于行的DBMS和基于的DBMS都使用SQL作为查询语言,但是面向的DBMS可能会提供更好的查询性能。假设您需要根据ID出表的所有名称;而不是遍历...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,934
精华内容 56,373
关键字:

关系中的列称为属性