Tersine MühendislikReverse Engineering

Tersine mühendislik, yapı iskelesi varlık türü sınıfları ve veritabanı şemasını temel alan bir DbContext sınıfı işlemidir.Reverse engineering is the process of scaffolding entity type classes and a DbContext class based on a database schema. Scaffold-DbContextEF Core Paket Yöneticisi Konsolu (PMC) araçlarının komutu veya dotnet ef dbcontext scaffold .NET komut satırı ARABIRIMI (CLI) araçlarının komutu kullanılarak gerçekleştirilebilir.It can be performed using the Scaffold-DbContext command of the EF Core Package Manager Console (PMC) tools or the dotnet ef dbcontext scaffold command of the .NET Command-line Interface (CLI) tools.

YükleniyorInstalling

Ters mühendisden önce, PMC araçları 'nı (yalnızca Visual Studio) veya CLI araçlarınıyüklemeniz gerekir.Before reverse engineering, you'll need to install either the PMC tools (Visual Studio only) or the CLI tools. Ayrıntılar için bkz. bağlantılar.See links for details.

Ayrıca, ters mühendislik uygulamak istediğiniz veritabanı şeması için uygun bir veritabanı sağlayıcısı yüklemeniz gerekir.You'll also need to install an appropriate database provider for the database schema you want to reverse engineer.

Bağlantı dizesiConnection string

Komutun ilk bağımsız değişkeni veritabanına yönelik bir bağlantı dizesidir.The first argument to the command is a connection string to the database. Araçlar, veritabanı şemasını okumak için bu bağlantı dizesini kullanır.The tools will use this connection string to read the database schema.

Bağlantı dizesini nasıl teklifiniz ve kaçış, komutu yürütmek için kullandığınız kabuğa bağlıdır.How you quote and escape the connection string depends on which shell you are using to execute the command. Ayrıntılar için kabuğunuzun belgelerine bakın.Refer to your shell's documentation for specifics. Örneğin, PowerShell karakterden kaçar $ , ancak içermemelidir \ .For example, PowerShell requires you to escape the $ character, but not \.

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer

Yapılandırma ve Kullanıcı gizli dizileriConfiguration and User Secrets

Bir ASP.NET Core projeniz varsa, Name=<connection-string> yapılandırmadan bağlantı dizesini okumak için söz dizimini kullanabilirsiniz.If you have an ASP.NET Core project, you can use the Name=<connection-string> syntax to read the connection string from configuration.

Bu, veritabanı parolanızı kod tabanınızdan ayrı tutmak için gizli dizi yöneticisi aracıyla iyi bir şekilde çalışacaktır.This works well with the Secret Manager tool to keep your database password separate from your codebase.

dotnet user-secrets set ConnectionStrings.Chinook "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook"
dotnet ef dbcontext scaffold Name=ConnectionStrings.Chinook Microsoft.EntityFrameworkCore.SqlServer

Sağlayıcı adıProvider name

İkinci bağımsız değişken sağlayıcı adıdır.The second argument is the provider name. Sağlayıcı adı, genellikle sağlayıcının NuGet paket adıyla aynıdır.The provider name is typically the same as the provider's NuGet package name.

Tabloları belirtmeSpecifying tables

Veritabanı şemasındaki tüm tablolar varsayılan olarak varlık türlerine ters mühendislik yapılır.All tables in the database schema are reverse engineered into entity types by default. Şemaları ve tabloları belirterek hangi tabloların tersine mühendislik uygulanabilir olduğunu sınırlayabilirsiniz.You can limit which tables are reverse engineered by specifying schemas and tables.

--schemaSeçeneği, bir şema içindeki her tabloyu eklemek için kullanılabilir, ancak --table belirli tabloları dahil etmek için kullanılabilir.The --schema option can be used to include every table within a schema, while --table can be used to include specific tables.

Birden çok tablo eklemek için, bu seçeneği birden çok kez belirtin:To include multiple tables, specify the option multiple times:

dotnet ef dbcontext scaffold ... --table Artist --table Album

Adları korumaPreserving names

Tablo ve sütun adları, varsayılan olarak türler ve özellikler için .NET adlandırma kurallarıyla daha iyi eşleşecek şekilde düzeltilir.Table and column names are fixed up to better match the .NET naming conventions for types and properties by default. -UseDatabaseNamesANAHTARıN PMC 'de veya --use-database-names .NET Core CLI seçeneğinde belirtilmesi, özgün veritabanı adlarını mümkün olduğunca korumak için bu davranışı devre dışı bırakır.Specifying the -UseDatabaseNames switch in PMC or the --use-database-names option in the .NET Core CLI will disable this behavior preserving the original database names as much as possible. Geçersiz .NET tanımlayıcıları düzeltilmeye devam eder ve gezinme özellikleri gibi birleştirilmiş adlar yine de .NET adlandırma kurallarıyla uyumlu olacaktır.Invalid .NET identifiers will still be fixed and synthesized names like navigation properties will still conform to .NET naming conventions.

Akıcı API veya veri ek açıklamalarıFluent API or Data Annotations

Varlık türleri, varsayılan olarak akıcı API kullanılarak yapılandırılır.Entity types are configured using the Fluent API by default. -DataAnnotations --data-annotations Mümkün olduğunda veri açıklamalarını kullanmak için (PMC) veya (.NET Core CLI) belirtin.Specify -DataAnnotations (PMC) or --data-annotations (.NET Core CLI) to instead use data annotations when possible.

Örneğin, akıcı API 'YI kullanmak bu şekilde ele alınacaktır:For example, using the Fluent API will scaffold this:

entity.Property(e => e.Title)
    .IsRequired()
    .HasMaxLength(160);

Veri ek açıklamalarını kullanırken bu işlem aşağıdaki şekilde ele alınacaktır:While using Data Annotations will scaffold this:

[Required]
[StringLength(160)]
public string Title { get; set; }

DbContext adıDbContext name

Scafkatlı DbContext sınıfı adı, varsayılan olarak bağlam ile düzeltilen veritabanı adının adı olacaktır.The scaffolded DbContext class name will be the name of the database suffixed with Context by default. Farklı bir tane belirtmek için, -Context PMC ve .NET Core CLI içinde kullanın --context .To specify a different one, use -Context in PMC and --context in the .NET Core CLI.

Dizinler ve ad alanlarıDirectories and namespaces

Varlık sınıfları ve bir DbContext sınıfı, projenin kök dizinine yönelik yapı ve projenin varsayılan ad alanını kullanır.The entity classes and a DbContext class are scaffolded into the project's root directory and use the project's default namespace.

Sınıfların kullanılarak ayrıştırılmamış dizini belirtebilir --output-dir ve --context-dir DbContext sınıfını varlık türü sınıflarından ayrı bir dizine dönüştürmek için kullanılabilir:You can specify the directory where classes are scaffolded using --output-dir, and --context-dir can be used to scaffold the DbContext class into a separate directory from the entity type classes:

dotnet ef dbcontext scaffold ... --context-dir Data --output-dir Models

Varsayılan olarak, ad alanı kök ad alanı ve projenin kök dizini altındaki herhangi bir alt dizinin adı olacaktır.By default, the namespace will be the root namespace plus the names of any subdirectories under the project's root directory. Ancak, EFCore 5,0 ve sonraki sürümlerinde, kullanarak tüm çıkış sınıfları için ad alanını geçersiz kılabilirsiniz --namespace .However, from EFCore 5.0 onwards, you can override the namespace for all output classes by using --namespace. Ayrıca, kullanarak yalnızca DbContext sınıfının ad alanını geçersiz kılabilirsiniz --context-namespace :You can also override the namespace for just the DbContext class using --context-namespace:

dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace

Nasıl çalışır?How it works

Tersine mühendislik, veritabanı şemasını okuyarak başlar.Reverse engineering starts by reading the database schema. Tablolar, sütunlar, kısıtlamalar ve dizinler hakkında bilgi okur.It reads information about tables, columns, constraints, and indexes.

Daha sonra, şema bilgilerini bir EF Core modeli oluşturmak için kullanır.Next, it uses the schema information to create an EF Core model. Tablolar varlık türleri oluşturmak için kullanılır; sütunları özellik oluşturmak için kullanılır; ve yabancı anahtarlar ilişki oluşturmak için kullanılır.Tables are used to create entity types; columns are used to create properties; and foreign keys are used to create relationships.

Son olarak, model kod oluşturmak için kullanılır.Finally, the model is used to generate code. Aynı modeli uygulamanızdan yeniden oluşturmak için karşılık gelen varlık türü sınıfları, akıcı API ve veri ek açıklamaları yapı iskelesi yapılır.The corresponding entity type classes, Fluent API, and data annotations are scaffolded in order to re-create the same model from your app.

SınırlamalarLimitations

  • Bir modelle ilgili her şey, bir veritabanı şeması kullanılarak gösterilebilir.Not everything about a model can be represented using a database schema. Örneğin, Devralma hiyerarşileri, sahip olunan türlerve tablo bölme hakkında bilgiler veritabanı şemasında yok.For example, information about inheritance hierarchies, owned types, and table splitting are not present in the database schema. Bu nedenle, bu yapılar hiçbir şekilde tersine mühendislik olmayacaktır.Because of this, these constructs will never be reverse engineered.
  • Ayrıca, bazı sütun türleri EF Core sağlayıcısı tarafından desteklenmeyebilir.In addition, some column types may not be supported by the EF Core provider. Bu sütunlar modele eklenmeyecek.These columns won't be included in the model.
  • Aynı anda iki kullanıcının aynı varlığı güncelleştirmesini engellemek için bir EF Core modelinde eşzamanlılık belirteçleritanımlayabilirsiniz.You can define concurrency tokens, in an EF Core model to prevent two users from updating the same entity at the same time. Bazı veritabanlarının bu tür bir sütunu (örneğin, SQL Server) temsil etmesi için özel bir türü vardır; bu durumda bu bilgilere ters mühendislik uygulanabilir. Ancak, diğer eşzamanlılık belirteçleri tersine mühendislik uygulanmaz.Some databases have a special type to represent this type of column (for example, rowversion in SQL Server) in which case we can reverse engineer this information; however, other concurrency tokens will not be reverse engineered.
  • C# 8 Nullable başvuru türü özelliği Şu anda ters mühendislik içinde desteklenmiyor: EF Core her zaman özelliğin devre dışı olduğunu varsayan c# kodu üretir.The C# 8 nullable reference type feature is currently unsupported in reverse engineering: EF Core always generates C# code that assumes the feature is disabled. Örneğin, null yapılabilir metin sütunları, string string? bir özelliğin gerekli olup olmadığını yapılandırmak Için kullanılan akıcı API veya veri ek açıklamaları ile değil, türünde bir özellik olarak yapı haline getirilecektir.For example, nullable text columns will be scaffolded as a property with type string , not string?, with either the Fluent API or Data Annotations used to configure whether a property is required or not. Yapı iskelesi kodunu düzenleyebilir ve bunları C# null olabilme ek açıklamalarıyla değiştirebilirsiniz.You can edit the scaffolded code and replace these with C# nullability annotations. Null yapılabilir başvuru türleri için yapı iskelesi desteği #15520soruna göre izlenir.Scaffolding support for nullable reference types is tracked by issue #15520.

Modeli özelleştirmeCustomizing the model

EF Core tarafından oluşturulan kod kodunuz.The code generated by EF Core is your code. Bunu değiştirebilirsiniz.Feel free to change it. Yalnızca aynı modele yeniden mühendislik uygulamanız durumunda yeniden oluşturulur.It will only be regenerated if you reverse engineer the same model again. Yapı iskelesi kodu, veritabanına erişmek için kullanılabilecek bir modeli temsil eder, ancak yalnızca kullanılabilecek tek model değildir.The scaffolded code represents one model that can be used to access the database, but it's certainly not the only model that can be used.

Varlık türü sınıflarını ve DbContext sınıfını gereksinimlerinize uyacak şekilde özelleştirin.Customize the entity type classes and DbContext class to fit your needs. Örneğin, türleri ve özellikleri yeniden adlandırmayı, devralma hiyerarşileri tanıtmanızı veya bir tabloyu birden çok varlığa bölmeyi seçebilirsiniz.For example, you may choose to rename types and properties, introduce inheritance hierarchies, or split a table into to multiple entities. Ayrıca, benzersiz olmayan dizinleri, kullanılmayan dizileri ve gezinti özelliklerini, isteğe bağlı skaler özellikleri ve modelden kısıtlama adlarını da kaldırabilirsiniz.You can also remove non-unique indexes, unused sequences and navigation properties, optional scalar properties, and constraint names from the model.

Ayrıca ek oluşturucular, Yöntemler, özellikler vb. ekleyebilirsiniz.You can also add additional constructors, methods, properties, etc. ayrı bir dosyada başka bir kısmi sınıf kullanılıyor.using another partial class in a separate file. Bu yaklaşım, modele geri dönmek istediğinizde bile geçerlidir.This approach works even when you intend to reverse engineer the model again.

Model güncelleştiriliyorUpdating the model

Veritabanında değişiklik yaptıktan sonra, EF Core modelinizi bu değişiklikleri yansıtacak şekilde güncelleştirmeniz gerekebilir.After making changes to the database, you may need to update your EF Core model to reflect those changes. Veritabanı değişiklikleri basittir, değişiklikleri EF Core modelinizde el ile yapmak en kolay olabilir.If the database changes are simple, it may be easiest just to manually make the changes to your EF Core model. Örneğin, bir tabloyu veya sütunu yeniden adlandırma, bir sütunu kaldırma veya bir sütunun türünü güncelleştirme, kodda yapılacak basit değişikliklerdir.For example, renaming a table or column, removing a column, or updating a column's type are trivial changes to make in code.

Ancak, daha önemli değişiklikler, el ile hızlı bir şekilde yapılır.More significant changes, however, are not as easy make manually. Yaygın olarak kullanılan bir iş akışı, -Force --force var olan modeli güncelleştirilmiş bir dosyanın üzerine yazmak için (PMC) veya (CLI) kullanarak modele geri doğru mühendislik kullanmaktır.One common workflow is to reverse engineer the model from the database again using -Force (PMC) or --force (CLI) to overwrite the existing model with an updated one.

Diğer bir yaygın olarak istenen özellik, yeniden adlandırmalar, tür hiyerarşileri vs. gibi özelleştirmeyi korurken modeli veritabanından güncelleştirebilme yeteneğidir. Bu özelliğin ilerlemesini izlemek için sorun #831 kullanın.Another commonly requested feature is the ability to update the model from the database while preserving customization like renames, type hierarchies, etc. Use issue #831 to track the progress of this feature.

Uyarı

Modele yeniden veritabanından geri dönmek isterseniz, dosyalarda yaptığınız tüm değişiklikler kaybedilir.If you reverse engineer the model from the database again, any changes you've made to the files will be lost.