Creating Extents

[This content is no longer valid. For the latest information on "M", "Quadrant", SQL Server Modeling Services, and the Repository, see the Model Citizen blog.]

An extent is a value that defines storage. Extents can be specified directly or derived from types. All module-scoped extents cause SQL tables to be created when compiled. Extents that occur inside types cause SQL tables to be generated when an extent of the containing type is declared in a module.

There are a number of ways to create extents. A collection of entities is one of the most common kinds of extents.

Any collection is an extent. This includes the following cases:

  • Collections of entities.

  • Collections of entity types.

  • Collection of simple (non-entity) types, such as ClaimIds : Integer32*;.

There are also ways to create non-collection extents. These include the following cases:

  • Derived from an entity type, such as Owner : Employee;.

  • Individual, simple, non-entity field, such as HomeSite : Text*;.

Collections of Entity Values

Extents can be defined without referencing a type. This is useful when a data structure is not expected to be reused. In this case the type of the extent is inferred and is anonymous, without a name.

The following example defines the extent by directly specifying the items that it contains.

module Northwind 
{
    Addresses 
    { 
        {Id => 1, Folder => 1, State => "NC", Zip => 28173},
        {Id => 2, Folder => 1, State => "WA", Zip => 55555}
    };
}

This code causes the following T-SQL code to be generated. Note that because initial values are specified, T-SQL insert statements are generated.

create table [Northwind].[Addresses]
(
  [Folder] int not null,
  [Id] int not null,
  [State] nvarchar(max) not null,
  [Zip] int not null
);
go
insert into [Northwind].[Addresses] ([Id], [Folder], [State], [Zip])
 values (1, 1, N'NC', 28173)
;
insert into [Northwind].[Addresses] ([Id], [Folder], [State], [Zip])
 values (2, 1, N'WA', 55555)
;

Collections of Entity Types

When you expect to reuse a data structure, define it as an entity type and reference that type when creating the extent. Do this by defining the entity type and then define the extent as a collection of those entity types.

In the following code, Employee is defined as an entity type. The Employees extent is defined as a collection of Employee types by referencing that type and appending the * operator, as shown in the following example.

The example also shows one way of initializing the entities in the Employees extent.

module Northwind {
    type Employee {
        ID      : Integer32;
        LastName : Text;
        FirstName : Text; 
    }
    Employees : {(Employee where identity ID)*};
    
    Employees
    {
        {ID => 1, LastName => "Doe",   FirstName => "John"},
        {ID => 2, LastName => "Jones", FirstName => "Jane"}
    }
}

This code causes the following T-SQL code to be generated.

create table [Northwind].[Employees]
(
    [ID] int not null,
    [LastName] nvarchar(max) not null,
    [FirstName] nvarchar(max) not null,
    constraint [PK_Employees] primary key clustered ([ID])
);
go
insert into [Northwind].[Employees] ([ID], [LastName], [FirstName])
    values (1, N'Doe', N'John'),
        (2, N'Jones', N'Jane');
go

Simple Field Extents

Extents can also be defined from simple types. In the following example, ItemCount is an extent.

module Northwind 
{
    ItemCount : Integer32;
}

This code causes the following T-SQL code to be generated.

create table [Northwind].[ItemCount]
(
  [Item] int not null
);