
рдПрдХ рдмрд╛рд░ MSSQL DBMS рдХреЗ рд╕рд╛рде EF 6 рдкрд░ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдерд╛ред рдФрд░ PostgreSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЗрдЦ рд╣реИрдВ, рдФрд░ рдордВрдЪреЛрдВ рдкрд░ рдЖрдк рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЪрд░реНрдЪрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рдирд┐рдХрд▓рд╛, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдирдП рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдПрдХреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╣рдордиреЗ рдЬрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛, рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдЪреБрдирд╛ред
рдкреГрд╖реНрдарднреВрдорд┐
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЙрддреНрдкрд╛рдж рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЗрд╕реЗ рдПрдХ DBMS - MSSQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ EF 6 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдХреЛрдб рдкреНрд░рдердо рджреГрд╖реНрдЯрд┐рдХреЛрдг) рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдкрд░рдд рд╣реИред рд╣рдо рдИрдПрдл 6 рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд▓рд╛рдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд╛рдкрдирд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ, рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд:
static void Main(string[] args) { if (args.Length == 0) { throw new Exception("No arguments in command line"); } var connectionString = args[0]; Console.WriteLine($"Initializing dbcontext via {connectionString}"); try { using (var context = MyDbContext(connectionString)) { Console.WriteLine("Database created"); } } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
рдЗрд╕реА рд╕рдордп, рдИрдПрдл рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рдбреЛрдореЗрди рдбреЛрдореЗрди рдПрдХ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ, рдЬреЛ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдирд┐рд░реНрдорд╛рддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public class MyDbContext : IdentityDbContext<User, Role, Key, UserLogin, UserRole, UserClaim>, IUnitOfWork { public MyDbContext(string connectionString) : base(connectionString) { Database.SetInitializer(new DbInitializer()); Database.Initialize(true); } }
рдкрд╣рд▓рд╛ рд▓реЙрдиреНрдЪ
рд╣рдордиреЗ рдЬреЛ рдкрд╣рд▓рд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рд╡рд╣ рджреЛ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП nuget: Npgsql рдФрд░ EntityFramework6.Npgsql рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдерд╛ред
рд╣рдордиреЗ рдЕрдкрдиреЗ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ App.config рдореЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рднреА рдкрдВрдЬреАрдХреГрдд рдХреА рд╣реИрдВред
UnitFramework рдЕрдиреБрднрд╛рдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░рдЦрд╛рдирд╛ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:
<entityFramework> <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, EntityFramework6.Npgsql" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" /> </providers> </entityFramework>
DbProviderFactories рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдирдП рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
<system.data> <DbProviderFactories> <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data>
рдФрд░ рддреБрд░рдВрдд, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕рд░реНрд╡рд░ рдХреЗ рдкрддреЗ рдФрд░ рд╕рд░реНрд╡рд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреА рд╕рд╛рдЦ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рд╣реИ:
тАЬрд╕рд░реНрд╡рд░ = рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ; DataBase = TestPostgresDB; рдПрдХреАрдХреГрдд рд╕реБрд░рдХреНрд╖рд╛ = рдЭреВрдареА; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd тАЭ
рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рдореИрдиреБрдЕрд▓ рдИрдПрдл рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЛрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рдХреА рдбреЗрдЯрд╛рдмреЗрд╕ рдЫрд╡рд┐ рдХреЛ рдорд┐рд╕рдореИрдЪ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реБрдИред рдирдП рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдердорд┐рдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдФрд░ Postgres рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ "рдСрдЯреЛ-рдорд╛рдЗрдЧреНрд░реЗрд╢рди" рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ - рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдХрд▓реНрдк рдЕрдЧрд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЯреАрдо рдореЗрдВ рдбреЛрдореЗрди рдореЙрдбрд▓ рдФрд░ рдИрдПрдл рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рддрд╛ рд╣реИ:
public sealed class Configuration : DbMigrationsConfiguration<MyDbContext> { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = "Project.Infrastructure.MyDbContext"; } }
рджреВрд╕рд░реЗ, рд╣рдордиреЗ рдПрдХ рдирдпрд╛ рдкреНрд░рджрд╛рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХреНрд▓рд╛рд╕ CreateDatabaseIfNotExists рдХреА рдЖрд░рдВрдн рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдЖрд░рдВрдн рдХрд░реЗрдВ, рдЬрд╣рд╛рдБ рд╣рдо рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
public class DbInitializer : CreateDatabaseIfNotExists<MyDbContext> { public override void InitializeDatabase(MyDbContext context) { DbMigrator dbMigrator = new DbMigrator(new Configuration {
рдЕрдЧрд▓рд╛, рд╣рдордиреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЕрдкрдирд╛ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред рдЗрд╕ рдмрд╛рд░, рд╕рдВрджрд░реНрдн рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╣реБрдЖ, рдФрд░ рд╣рдорд╛рд░реЗ рдбреЛрдореЗрди рдореЙрдбрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирдП рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред рдирдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ "__MigrationHistory" рд▓реЗрдмрд▓ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рд╡рд╛рд╕ рдХрд╛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдерд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рд╣рдо рдПрдХ рдирдП рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдПрдХ рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░рд╡рд╛рд╕рди рддрдВрддреНрд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред
рдореИрдиреНрдпреБрдЕрд▓ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЛрдб рдЪрд╛рд▓реВ рдХрд░реЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЛрдб рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреА рдЯреАрдо рдХреЛ рдбреЛрдореЗрди рдФрд░ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд▓рд╛рдпрди рдХрд╛ рдПрдХ рдореИрдиреБрдЕрд▓ рдореЛрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ AutomaticMigrationsEnabled рдлрд╝реАрд▓реНрдб рдХреЛ рдЧрд▓рдд рдкрд░ рд▓реМрдЯрд╛рдпрд╛ред рддрдм рдирдП рдкрд▓рд╛рдпрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╣рдордиреЗ рд╕рдордЭрд╛ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди, рдХрдо рд╕реЗ рдХрдо, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ PostgresMigrations рдирд╛рдордХ рдПрдХ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП MsSql рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╡рд╛рд▓рд╛ рдлрд╝реЛрд▓реНрдбрд░, рд╣рдордиреЗ рдЗрд╕реЗ MsSqlMigrations рдирд╛рдо рджрд┐рдпрд╛), рдФрд░ MsSql рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИред рдЙрд╕реА рд╕рдордп, рд╣рдордиреЗ PostgresSql рдХреЗ рд╕рднреА рдореМрдЬреВрджрд╛ MsSql рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдХреАред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрди рд╕рднреА рдореЗрдВ MsSql рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирдП DBMS рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рджреВрд╕рд░реЗ, рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдирдП DBMS рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдирд╡реАрдирддрдо рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╡рд╛рд╕ рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рдерд╛ред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрджрд░реНрдн рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░, рдЗрд╕ рддрдереНрдп рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рднреМрддрд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдордиреЗ рдкреИрдХреЗрдЬ рдХрдиреЗрдХреНрд╢рди рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдкрдбреЗрдЯ-рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдЦреБрд╢реА рд╕реЗ рдмрдирд╛рдпрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ DBMS рд╕реЗ рдЬреБрдбрд╝рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред
рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдЕрджреНрдпрддрди-рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдорд╛рдВрдб рдХреЗ рдХрд╛рд░реНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд┐рдП:
- рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛:
MsSql рдХреЗ рд▓рд┐рдП:
public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "Project.Infrastructure.MyDbContext"; MigrationsDirectory = @"MsSqlMigrations"; }
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд▓рд┐рдП:
public Configuration() { AutomaticMigrationsEnabled = false; ContextKey = "Project.Infrastructure.MyDbContext"; MigrationsDirectory = @"PostgresMigrations"; }
- рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрдкрдбреЗрдЯ-рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдорд╛рдВрдб рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛
- рдЬреЛрдбрд╝реЗ рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдлрд╝рдИ рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рд╣реИ, рдФрд░ рдирдП рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд╛рд▓рд╛ рдлрд╝реЛрд▓реНрдбрд░
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдпрд╣ рдЖрджреЗрд╢ рдорд┐рд▓рд╛:
Update-Database -ProjectName "Project.Infrastructure" -ConfigurationTypeName Project.Infrastructure.PostgresMigrations.Configuration -ConnectionString "Server = localhost; DataBase = TestPostgresDB; рдПрдХреАрдХреГрдд рд╕реБрд░рдХреНрд╖рд╛ = рдЭреВрдареА; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd "-ConnectionProviderName" Npgsql "
рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╣рд▓реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдирд╛рдордХрд░рдг рдХреЗ рд╕рд╛рде рдПрдб-рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрдорд╛рдВрдб рдХреЛ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ:
рдРрдб-рдорд╛рдЗрдЧреНрд░реЗрд╢рди -Name "InitialCreate" -ProjectName "CrossTech.DSS.Infrastructure" -ConfigurationTypeName CrossTech.DSS.Infrastructure.PostgresMigrations .Configuration -ConnectionString "Server = localhost; DataBase = TestPostgresDB; рдПрдХреАрдХреГрдд рд╕реБрд░рдХреНрд╖рд╛ = рдЭреВрдареА; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd "-ConnectionProviderName" Npgsql "
PostgresMigrations рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреА рд╣реИ: 201701012070506868_InitialCreate.cs
рдлрд┐рд░ рд╣рдордиреЗ рдЕрдкрдбреЗрдЯ-рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрдирд╛рдП рдЧрдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдорд┐рд▓ рдЧрдпрд╛ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рд╣рдо рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдХреНрд╖рдо рдереЗ, рдирдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рдереЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдореИрдиреБрдЕрд▓ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдЖрдП рдереЗред
рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдЦреБрд▓рд╛ рд╕рд╡рд╛рд▓ рдерд╛: рд╕рдВрджрд░реНрдн рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ DBMS рддрдХ рдкрд╣реБрдВрдЪ рд╕рдВрднрд╡ рд╣реЛ?
рдХрд╛рд░реНрдп рдпрд╣ рдерд╛ рдХрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд▓рдХреНрд╖реНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред рдЗрд╕ рд╕реНрд╡рд┐рдЪ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдП рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
App.config (рдФрд░ рдпрджрд┐ рдЖрдк app.config, рддрдм machine.config рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдо рдкреНрд░рджрд╛рддрд╛ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрджрд░реНрдн рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд╣рдо рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рдХрдиреЗрдХреНрд╢рди рдирд╛рдо "рдбреНрд░реЙрдк" рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рд╣рдо DbConfiguration рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ DbConfiguration рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рдВрд╢рд╛рдиреБрдЧрдд DbConfiguration рд╡рд░реНрдЧ:
public class DbConfig : DbConfiguration { public DbConfig(string connectionName, string connectionString, string provideName) { ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(connectionName, connectionString, provideName)); switch (connectionName) { case "PostgresDbConnection": this.SetDefaultConnectionFactory(new NpgsqlConnectionFactory()); this.SetProviderServices(provideName, NpgsqlServices.Instance); this.SetProviderFactory(provideName, NpgsqlFactory.Instance); break; case "MsSqlDbConnection": this.SetDefaultConnectionFactory(new SqlConnectionFactory()); this.SetProviderServices(provideName, SqlProviderServices.Instance); this.SetProviderFactory(provideName, SqlClientFactory.Instance); this.SetDefaultConnectionFactory(new SqlConnectionFactory()); break; } } }
рдФрд░ рд╕рдВрджрд░реНрдн рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
var connectionName = args[0]; var connectionString = args[1]; var provideName = args[2]; DbConfiguration.SetConfiguration(new DbConfig(connectionName, connectionString, provideName)); using (var context = MyDbContext(connectionName)) { Console.WriteLine("Database created"); }
рдФрд░ рдЬрд┐рд╕рдиреЗ рдзреНрдпрд╛рди рд╕реЗ рдкреАрдЫрд╛ рдХрд┐рдпрд╛, рдЙрд╕рдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рд╣рдореЗрдВ рдХреЛрдб рдореЗрдВ рдПрдХ рдФрд░ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдерд╛ред рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЯрд╛рд░рдЧреЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдмрддрд╛рдИ рдЧрдИ InitializeDatabase рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
рд╣рдордиреЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝рд╛:
public class DbInitializer : CreateDatabaseIfNotExists<MyDbContext> { private string _connectionName; public DbInitializer(string connectionName) { _connectionName = connectionName; } public override void InitializeDatabase(MyDbContext context) { DbMigrationsConfiguration<MyDbContext> config; switch (_connectionName) { case "PostgresDbConnection": config = new PostgresMigrations.Configuration(); break; case "MsSqlDbConnection": config = new MsSqlMigrations.Configuration(); break; default: config = null; break; } if (config == null) return; config.TargetDatabase = new DbConnectionInfo(_connectionName); DbMigrator dbMigrator = new DbMigrator(config);
рдФрд░ рд╕рдВрджрд░реНрдн рдирд┐рд░реНрдорд╛рддрд╛ рдЦреБрдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд▓рдЧреЗ:
public MyDbContext(string connectionNameParam) : base(connectionString) { Database.SetInitializer(new DbInitializer(connectionName = connectionNameParam)); Database.Initialize(true); }
рдЕрдЧрд▓рд╛, рд╣рдордиреЗ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ MsSql рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ DBMS рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ред рд╣рдо рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
"MsSqlDbConnection" "рд╕рд░реНрд╡рд░ = localhost \ SQLEXPRESS; рдбреЗрдЯрд╛рдмреЗрд╕ = TestMsSqlDB; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рд╕рд╛; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd "" System.Data.SqlClient "
MsSql рдбреЗрдЯрд╛рдмреЗрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдлрд┐рд░ рд╣рдордиреЗ рдЖрд╡реЗрджрди рддрд░реНрдХреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛:
"PostgresDbConnection" "рд╕рд░реНрд╡рд░ = рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ; DataBase = TestPostgresDB; рдПрдХреАрдХреГрдд рд╕реБрд░рдХреНрд╖рд╛ = рдЭреВрдареА; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd "" Npgsql "
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рдФрд░ рдЙрдк-рдпреЛрдЧ - рдИрдПрдл рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
- рдЗрд╕ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рддрдВрддреНрд░ "рдЗрдВрдбрд┐рдХреЗрдЯ" рдХрд░реЗрдВ
- рд╕рдВрджрд░реНрдн рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ DBMS рдХрдиреЗрдХреНрд╢рди рддрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рд╣рдо рдПрдХ рдЯреАрдо рдореЗрдВ рджреЛ DBMS рдХреЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рдбреЛрдореЗрди рдореЗрдВ рдирдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рджреЛ DBMS рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рддреЛ, MSSQL рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдорд╛рдВрдбреНрд╕, рдЬрдм рдкрд╣рд▓рд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп):
- рдЕрдВрддрд┐рдо рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛
рдЕрджреНрдпрддрди-рдбреЗрдЯрд╛рдмреЗрд╕ -ProjectName "Project.Infrastructure" -ConfigurationTypeName Project.Infrastructure.MsSqlMigrations.Configuration -ConnectionString "Server = localhost; DataBase = TestMsSqlDB; рдПрдХреАрдХреГрдд рд╕реБрд░рдХреНрд╖рд╛ = рдЭреВрдареА; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рд╕рд╛; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd "-ConnectionProviderName" System.Data.SqlClient "
- рдирдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛
рдРрдб-рдорд╛рдЗрдЧреНрд░реЗрд╢рди -рдирд╛рдо "SomeMigrationName" -ProjectName "Project.Infrastructure" -ConfigurationTypeName Project.Infrastructure.MsSqlMigrations.Configuration -ConnectionString "Server = localhost; DataBase = TestMsSqlDB; рдПрдХреАрдХреГрдд рд╕реБрд░рдХреНрд╖рд╛ = рдЭреВрдареА; рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА = рд╕рд╛; рдкрд╛рд╕рд╡рд░реНрдб = рдкрд╛ $ $ w0rd "-ConnectionProviderName" System.Data.SqlClient "
рдЬрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдбреЛрдореЗрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрдИ рд╕рдВрдШрд░реНрд╖ рд╣реЛрддреЗ рд╣реИрдВ (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рд╣рдо рдЧрд┐рдЯ рдХрд╣реЗрдВрдЧреЗ)ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдИрдПрдл рдХреЗ рд▓рд┐рдП рдкрд▓рд╛рдпрди рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдмрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдкреНрд░рд╡рд╛рд╕рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рдореЙрдбрд▓ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдЕрдВрддрд┐рдо рдмрдирд╛рдП рдЧрдП рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЗрд╕реА рд╕рдордп, рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреАрдо рдореЗрдВ рдИрдПрдл рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкрд░ рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдФрд░ рдЬрд┐рдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИрдВ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рд╣рдордд рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рдХреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рд╣рдЯрд╛рдП рдЧрдП рд╕реНрдерд╛рдиреАрдп рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╣рдЯрд╛рдПрдВ
- рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕реНрд╡рдпрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЦреАрдВрдЪреЛ, рдЬрд╣рд╛рдВ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдирд╛ рдкрд▓рд╛рдпрди рдбрд╛рд▓рд╛ рд╣реИ
- рд╕реНрдерд╛рдиреАрдп рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ git рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╣рдо рдИрдПрдл рдорд╛рдЗрдЧреНрд░реЗрд╢рди рддрдВрддреНрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╣рдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдгрд┐рдд рдЯреАрдо рд╡рд┐рдХрд╛рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рд╕рдордп рдПрдХрдорд╛рддреНрд░ рд╣реИред рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред рдФрд░ рдИрдПрдл рдорд╛рдЗрдЧреНрд░реЗрд╢рди рддрдВрддреНрд░ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЬрд░реВрд░реА рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ
EF6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП EF6 рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдХрдИ DBMS рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ Microsoft рдХреЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреАрдо рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рдо рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ред
рдмрд╛рдЬрд╛рд░ рдкрд░ рдХрдИ рд╡реИрдХрд▓реНрдкрд┐рдХ рдИрдПрдл рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд╕рдорд╛рдзрд╛рди рд╣реИрдВ (рднреБрдЧрддрд╛рди рдФрд░ рдореБрдХреНрдд рджреЛрдиреЛрдВ): рдбреАрдмреАрдпреВрдкреА, рд░рд╛рдЙрдВрдбрд╣реЛрд╕, рдерд┐рдВрдХрд┐рдВрдЧрд╣реЛрдоредрдирд┐рдЧреНрд░реЗрдЯрд░, рдлреНрд▓реБрдПрдВрдЯрдорд┐рдЧреЗрдЯрд░, рдЖрджрд┐ред рдФрд░ рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╡реЗ рдИрдПрдл рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдиреНрдирдпрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдФрд░ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо EF Core рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред рд╣рдордиреЗ рдИрдПрдл рдХреЛрд░ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рддрдВрддреНрд░ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рддреМрд▓рд╛ рдФрд░ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪреЗ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддреН рдлреНрд▓реБрдПрдВрдЯ рдорд╛рдЗрдЧреНрд░реЗрдЯрд░ред
рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдФрд░ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рд╡реЗрд▓рдХрдо!