Основные способы создания моделей

Содержание

Слайд 2

Основные способы создания моделей

Основные способы создания моделей

Слайд 3

Слайд 4

Слайд 5

CodeFirst – написание кода классов предметной области, при отсутствии модели и

CodeFirst – написание кода классов предметной области, при отсутствии модели и

БД.
Генерация БД и модели сущностей EDM происходит после построения проекта.
Слайд 6

Слайд 7

Демонстрация - создание базы с разными параметрами

Демонстрация - создание базы с разными параметрами

Слайд 8

Связи (отношений)«один к одному» public class PlayerInfo { [ForeignKey("Player")] public int

Связи (отношений)«один к одному»

public class PlayerInfo
{ [ForeignKey("Player")]
public int Id

{ get; set; }
public string Phone { get; set; }
public string Adress { get; set; }
public Player Player { get; set; }
}

public class Player
{
public int Id { get; set; } // внимание!!!
public string Name { get; set; }
public string Position { get; set; }
public int Age { get; set; }
public PlayerInfo PlayerInfo { get; set; }
}

Слайд 9

Связи (отношений) «один ко многим» public class Player { public int

Связи (отношений) «один ко многим»

public class Player
{
public int Id

{ get; set; }
public string Name { get; set; }
public string Position { get; set; }
public int Age { get; set; }
public Team Team { get; set; }
}

public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection Players { get; set; }
}

Слайд 10

Связи (отношений)«многие ко многим» public class Player { public int Id

Связи (отношений)«многие ко многим»

public class Player
{
public int Id {

get; set; }
public string Name { get; set; }
public string Position { get; set; }
public int Age { get; set; }
public ICollection Teams { get; set; }
}

public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public ICollectionPlayers { get; set; }
}

Слайд 11

Демонстрация - создание связанных таблиц базы

Демонстрация - создание связанных таблиц базы

Слайд 12

Настройка модели

Настройка модели

Слайд 13

Набор аттрибутов Data Annotations

Набор аттрибутов Data Annotations

Слайд 14

DataAnnotations: KeyAttribute

DataAnnotations: KeyAttribute

Слайд 15

DataAnnotations: RequiredAttribute

DataAnnotations: RequiredAttribute

Слайд 16

DataAnnotations: MinLengthи MaxLength

DataAnnotations: MinLengthи MaxLength

Слайд 17

DataAnnotations: NotMappedAttribute

DataAnnotations: NotMappedAttribute

Слайд 18

DataAnnotations: TableAttribute и ColumnAttribute

DataAnnotations: TableAttribute и ColumnAttribute

Слайд 19

Fluent API (fluent - текучий) представляет набор методов, которые определяют сопоставление

Fluent API (fluent - текучий) представляет набор методов, которые определяют сопоставление

между классами и их свойствами и таблицами и их столбцами.
Как правило, функционал Fluent API задействуется при переопределении метода OnModelCreating().

FluentAPI

public class LeagueContext : DbContext
{
public LeagueContext(): base("LeagueConnectionString")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}

Слайд 20

FluentAPI protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity ().ToTable("TeamPlayers"); modelBuilder.Entity

FluentAPI

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity().ToTable("TeamPlayers");
modelBuilder.Entity().HasKey(p => p.Id);
modelBuilder.Entity().Property(p

=> p.Name)
.IsRequired()
.HasMaxLength(20);
modelBuilder.Entity()
.Property(p => p.Rating)
.IsRequired()
.HasColumnName("Post");
modelBuilder.Entity().ToTable("FootBallPlayers");
modelBuilder.Entity().HasKey(p => p.Id);
modelBuilder.Entity().Property(p => p.LastName)
.IsRequired()
.HasMaxLength(20);
}
Слайд 21

protected override void OnModelCreating (DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // конфигурация модели

protected override void OnModelCreating
(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// конфигурация модели с

применением Fluent Api
modelBuilder.Configurations.Add(new TeamEntityTypeConfig());
modelBuilder.Configurations.Add(new PlayerEntityTypeConfig());
}

public class PlayerEntityTypeConfig :
EntityTypeConfiguration
{
public PlayerEntityTypeConfig()
{
ToTable("TeamPlayers");
HasKey(p => p.Id);
Property(p => p.Name).IsRequired().HasMaxLength(20);
Property(p => p.Position).IsRequired().HasColumnName("Post");
}
}

FluentAPI

Слайд 22

Соглашения Entity Framework по ограничению длины столбцов MinLength – это ограничение

Соглашения Entity Framework по ограничению длины столбцов

MinLength – это ограничение не

повлияет на таблицу базы данных. Используется только для настройки проверки достоверности. в Fluent API отсутствует метод HasMinLength()
Слайд 23

Соглашения Entity Framework по указанию типа столбца Entity Framework автоматически отображает

Соглашения Entity Framework по указанию типа столбца

Entity Framework автоматически отображает типы

данных модели на SQL-совместимые типы данных. Code-First позволяет управлять этим процессом, для того чтобы явно указать тип данных для столбца
Слайд 24

Соглашения Entity Framework по указанию поддержки значений NULL Соглашение Entity Framework

Соглашения Entity Framework по указанию поддержки значений NULL

Соглашение Entity Framework о

поддержке значений NULL в столбце таблицы гласит о том, что все типы .NET, поддерживающие значение null (объекты), отображаются на SQL-типы с явным указанием инструкции NULL, и наоборот, типы .NET, не поддерживающие значение null (структуры) отображаются на SQL-типы с явным указанием инструкции NOT NULL.
Слайд 25

Соглашения Entity Framework по указанию первичных ключей Entity Framework требует, чтобы

Соглашения Entity Framework по указанию первичных ключей

Entity Framework требует, чтобы каждый

класс сущностной модели имел уникальный ключ (т.к. для каждой таблицы в реляционной базе данных должен использоваться первичный ключ). Этот ключ используется в объекте контекста, для отслеживания изменений в объектах модели.
Entity Framework автоматически добавляет поддержку автоинкремента в ключевые поля.
Слайд 26

Работа со сложными типами данных public class Address { public int

Работа со сложными типами данных

public class Address
{ public int AddressId {

get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}

public class Team
{ public int Id { get; set; }
public string Name { get; set; }
public double Rating { get; set; }
public Address Address { get; set; }
public virtual ICollection Players { get; set; }
}

public class Player
{ public int Id { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public DateTime? BirthDay { get; set; }
public Address Address { get; set; }
public virtual Team Team { get; set; }
}

Слайд 27

Работа со сложными типами данных public class Address { //public int

Работа со сложными типами данных

public class Address
{ //public int AddressId {

get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }}

public class Team
{ public int Id { get; set; }
public string Name { get; set; }
public double Rating { get; set; }
public Address Address { get; set; }
public virtual ICollection Players { get; set; }}

public class Player
{ public int Id { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
public virtual Team Team { get; set; }
}

сложный тип не должен иметь ключ,
сложный тип должен содержать только простые свойства.
в классе, который использует этот тип, не разрешается указывать тип коллекции для свойства сложного типа (например, List

)
Слайд 28

Работа со сложными типами данных [ComplexType] public class Address { public

Работа со сложными типами данных

[ComplexType]
public class Address
{ public int AddressId {

get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }}

public class Team
{ public int Id { get; set; }
public string Name { get; set; }
public double Rating { get; set; }
public Address Address { get; set; }
public virtual ICollection Players { get; set; }}

public class Player
{ public int Id { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
public virtual Team Team { get; set; }
}

Слайд 29

Столбцы типа Timestamp Для каждой базы данных система содержит счетчик, значение

Столбцы типа Timestamp

Для каждой базы данных система содержит счетчик, значение которого

увеличивается всякий раз, когда вставляется или обновляется любая строка, содержащая ячейку типа TIMESTAMP, и присваивает этой ячейке данное значение. Таким образом, с помощью ячеек типа TIMESTAMP можно определить относительное время последнего изменения соответствующих строк таблицы.

Значение, сохраняемое в столбце типа TIMESTAMP, не представляет никакой важности. Этот столбец обычно используется для определения, изменилась ли определенная строка таблицы со времени последнего обращения к ней. Это позволяет решать вопросы параллельного доступа к таблице базы данных, позволяя блокировать другие потоки, если текущий поток изменил значения в строке.
В Code-First для указания на то, что столбец должен иметь тип TIMESTAMP используется одноименный атрибут Timestamp в аннотациях или метод IsRowVersion() в Fluent API

CREATE TABLE [dbo].[FootBallPlayers] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[LastName] NVARCHAR (20) NOT NULL,
[Age] INT NOT NULL,
[BirthDay] DATETIME NULL,
[Timestamp] ROWVERSION NOT NULL,