Similar presentations:
Основные способы создания моделей
1.
2.
22
3.
34.
45.
CodeFirst – написание кода классов предметнойобласти, при отсутствии модели и БД.
Генерация БД и модели сущностей EDM
происходит после построения проекта.
5
6.
67. Демонстрация - создание базы с разными параметрами
78.
public{
public
public
public
public
public
}
class Player
int Id { get; set; } // внимание!!!
string Name { get; set; }
string Position { get; set; }
int Age { get; set; }
PlayerInfo PlayerInfo { get; set; }
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; }
}
8
9.
public class Team{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Player> Players { 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 Team Team { get; set; }
}
9
10.
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<Team> Teams { get; set; }
}
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Player>Players { get; set; }
}
10
11. Демонстрация - создание связанных таблиц базы
1112.
1213.
1314.
1415.
1516.
1617.
1718.
1819.
Fluent API (fluent - текучий) представляет наборметодов, которые определяют сопоставление
между классами и их свойствами и таблицами и их
столбцами.
Как правило, функционал Fluent API задействуется
при переопределении метода OnModelCreating().
public class LeagueContext : DbContext
{
public LeagueContext(): base("LeagueConnectionString")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
19
}
20.
protected override void OnModelCreating(DbModelBuilder modelBuilder){
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Team>().ToTable("TeamPlayers");
modelBuilder.Entity<Team>().HasKey(p => p.Id);
modelBuilder.Entity<Team>().Property(p => p.Name)
.IsRequired()
.HasMaxLength(20);
modelBuilder.Entity<Team>()
.Property(p => p.Rating)
.IsRequired()
.HasColumnName("Post");
modelBuilder.Entity<Player>().ToTable("FootBallPlayers");
modelBuilder.Entity<Player>().HasKey(p => p.Id);
modelBuilder.Entity<Player>().Property(p => p.LastName)
.IsRequired()
.HasMaxLength(20);
}
20
21.
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<Player>
{
public PlayerEntityTypeConfig()
{
ToTable("TeamPlayers");
HasKey(p => p.Id);
Property(p => p.Name).IsRequired().HasMaxLength(20);
Property(p => p.Position).IsRequired().HasColumnName("Post");
}
}
21
22.
Соглашения Entity Framework по ограничению длины столбцовСоглашение
В
настройках
модели
можно
указывать
ограничение на максимальную длину для свойств,
имеющих тип String или byte[], которые
отображаются в таблице на соответствующие типы
NVARCHAR и VARBINARY. По умолчанию Code-First
задает
для
них
максимальную
длину
NVARCHAR(max) и VARBINARY(max).
Атрибуты
метаданных
MinLength (n)
MaxLength (n)
StringLength (n, MinimumLength=m)
Реализация в Fluent
API
Entity<T>().Property(t => t
.PropertyName)
.HasMaxLength(n)
MinLength – это ограничение не повлияет на таблицу базы данных.
Используется только для настройки проверки достоверности. в Fluent API
отсутствует метод HasMinLength()
22
23.
Соглашения Entity Framework по указанию типа столбцаСоглашение
Тип данных столбца в базе по умолчанию
определяется поставщиком базы данных, которую
вы используете. В SQL Server тип String в свойстве
модели отражается на тип NVARCHAR в таблице
базы данных, тип byte[] отражается на тип
VARBINARY и т.д. В настройках модели можно явно
указывать
тип
данных,
который
будет
использоваться в таблице.
Атрибут метаданных
Column (TypeName="тип данных")
Реализация в Fluent
API
Entity<T>().Property(t => t
.PropertyName)
.HasColumnType("тип данных")
Entity Framework автоматически отображает типы данных модели на SQLсовместимые типы данных. Code-First позволяет управлять этим процессом,
для того чтобы явно указать тип данных для столбца
23
24.
Соглашения Entity Framework по указанию поддержки значений NULLСоглашение
Entity Framework автоматически указывает для
типов string и byte[] поддержку NULL в таблице
базы данных, а для типов значений (int, long, …),
DateTime, char, bool поддержку NOT NULL.
Атрибут метаданных
Required
Реализация в Fluent
API
Entity<T>().Property(t => t
.PropertyName)
.IsRequired()
Соглашение Entity Framework о поддержке значений NULL в столбце таблицы
гласит о том, что все типы .NET, поддерживающие значение null (объекты),
отображаются на SQL-типы с явным указанием инструкции NULL, и наоборот,
типы .NET, не поддерживающие значение null (структуры) отображаются на
SQL-типы с явным указанием инструкции NOT NULL.
24
25.
Соглашения Entity Framework по указанию первичных ключейСоглашение
Entity Framework ищет свойства модели имеющие
имя Id или состоящие из строки “[TypeName] + Id”,
Например,
CustomerId
автоматически
устанавливается как первичный ключ в таблице
базы данных.
Атрибут метаданных
Key
Реализация в Fluent
API
Entity<T>().HasKey(t => t.PropertyName)
• Entity Framework требует, чтобы каждый класс сущностной модели
имел уникальный ключ (т.к. для каждой таблицы в реляционной
базе данных должен использоваться первичный ключ). Этот ключ
используется в объекте контекста, для отслеживания изменений в
объектах модели.
• Entity
Framework
автоматически
добавляет
поддержку
автоинкремента в ключевые поля.
25
26.
Работа со сложными типами данных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 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; }
}
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<Player> Players { get; set; }
}
26
27.
Работа со сложными типами данных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 Player
{
public int Id { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
public virtual Team Team { 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<Player> Players { get; set; }}
• сложный тип не должен иметь ключ,
• сложный тип должен содержать только простые свойства.
• в классе, который использует этот тип, не разрешается указывать 27тип
коллекции для свойства сложного типа (например, List<Address> )
28.
Работа со сложными типами данных[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 Player
{
public int Id { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
public virtual Team Team { 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<Player> Players { get; set; }}
28
29.
Столбцы типа TimestampДля каждой базы данных система содержит счетчик, значение которого
увеличивается всякий раз, когда вставляется или обновляется любая строка,
содержащая ячейку типа TIMESTAMP, и присваивает этой ячейке данное
значение. Таким образом, с помощью ячеек типа TIMESTAMP можно определить
относительное время последнего изменения соответствующих строк таблицы.
Значение, сохраняемое в столбце типа TIMESTAMP, не представляет никакой
важности. Этот столбец обычно используется для определения, изменилась ли
определенная строка таблицы со времени последнего обращения к ней. Это
позволяет решать вопросы параллельного доступа к таблице базы данных,
позволяя блокировать другие потоки, если текущий поток изменил значения в
строке.
В Code-First для указания на то, что столбец должен иметь тип TIMESTAMP
используется одноименный атрибут Timestamp в аннотациях или метод
IsRowVersion() в Fluent API
CREATE TABLE [dbo].[FootBallPlayers] (
[Id]
INT
[LastName]
NVARCHAR (20)
[Age]
INT
[BirthDay]
DATETIME
[Timestamp]
ROWVERSION
IDENTITY (1, 1) NOT NULL,
NOT NULL,
NOT NULL,
NULL,
NOT NULL,
29
30.
Методы миграцийОснову миграции составляют ряд методов, которые позволяют удалять,
добавлять столбцы и таблицы, изменять настройки столбцов и так далее.
Основные методы:
•CreateTable: добавляет таблицу
•DropTable: удаляет таблицу
•AddColumn: добавляет столбец
•DropColumn: удаляет столбец
•AlterColumn: изменяет настройки столбца
•AddForeignKey: добавляет внешний ключ
•DropForeignKey: удаляет внешний ключ
•AddPrimaryKey: добавляет первичный ключ
•DropPrimaryKey: удаляет первичный ключ
•CreateIndex: добавляет индекс
•DropIndex: удаляет индекс
•CreateStoredProcedure: создает хранимую процедуру
•DropStoredProcedure: удаляет хранимую процедуру
•AlterStoredProcedure: изменяет хранимую процедуру
30