Tersine Mühendislik
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. bu, Scaffold-DbContext EF Core Paket Yöneticisi konsolu (PMC) araçlarının komutu veya dotnet ef dbcontext scaffold .net komut satırı arabirimi (clı) araçlarının komutu kullanılarak gerçekleştirilebilir.
Yükleme
ters mühendisden önce, PMC araçları 'nı (yalnızca Visual Studio) veya clı araçlarınıyüklemeniz gerekir. Ayrıntılar için bkz. bağlantılar.
Ayrıca, ters mühendislik uygulamak istediğiniz veritabanı şeması için uygun bir veritabanı sağlayıcısı yüklemeniz gerekir.
Bağlantı dizesi
Komutun ilk bağımsız değişkeni veritabanına yönelik bir bağlantı dizesidir. Araçlar, veritabanı şemasını okumak için bu bağlantı dizesini kullanır.
Bağlantı dizesini nasıl teklifiniz ve kaçış, komutu yürütmek için kullandığınız kabuğa bağlıdır. Ayrıntılar için kabuğunuzun belgelerine bakın. Örneğin, PowerShell karakterden kaçar $ , ancak içermemelidir \ .
dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
Yapılandırma ve Kullanıcı gizli dizileri
bir ASP.NET Core projeniz varsa, Name=<connection-string> yapılandırmadan bağlantı dizesini okumak için söz dizimini kullanabilirsiniz.
Bu, veritabanı parolanızı kod tabanınızdan ayrı tutmak için gizli dizi yöneticisi aracıyla iyi bir şekilde çalışacaktır.
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ı
İkinci bağımsız değişken sağlayıcı adıdır. sağlayıcı adı, genellikle sağlayıcının NuGet paket adıyla aynıdır.
Tabloları belirtme
Veritabanı şemasındaki tüm tablolar varsayılan olarak varlık türlerine ters mühendislik yapılır. Şemaları ve tabloları belirterek hangi tabloların tersine mühendislik uygulanabilir olduğunu sınırlayabilirsiniz.
--schemaSeçeneği, bir şema içindeki her tabloyu eklemek için kullanılabilir, ancak --table belirli tabloları dahil etmek için kullanılabilir.
Birden çok tablo eklemek için, bu seçeneği birden çok kez belirtin:
dotnet ef dbcontext scaffold ... --table Artist --table Album
Adları koruma
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. -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. 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.
Fluent apı veya veri ek açıklamaları
varlık türleri varsayılan olarak Fluent apı kullanılarak yapılandırılır. -DataAnnotations--data-annotations Mümkün olduğunda veri açıklamalarını kullanmak için (PMC) veya (.NET Core CLI) belirtin.
örneğin, Fluent apı 'sini kullanmak bu şekilde aşağıdaki gibi olur:
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:
[Required]
[StringLength(160)]
public string Title { get; set; }
DbContext adı
Scafkatlı DbContext sınıfı adı, varsayılan olarak bağlam ile düzeltilen veritabanı adının adı olacaktır. Farklı bir tane belirtmek için, -Context PMC ve .NET Core CLI içinde kullanın --context .
Dizinler ve ad alanları
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.
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:
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. 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 . Ayrıca, kullanarak yalnızca DbContext sınıfının ad alanını geçersiz kılabilirsiniz --context-namespace :
dotnet ef dbcontext scaffold ... --namespace Your.Namespace --context-namespace Your.DbContext.Namespace
Nasıl çalışır?
Tersine mühendislik, veritabanı şemasını okuyarak başlar. Tablolar, sütunlar, kısıtlamalar ve dizinler hakkında bilgi okur.
Daha sonra, şema bilgilerini bir EF Core modeli oluşturmak için kullanır. 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.
Son olarak, model kod oluşturmak için kullanılır. aynı modeli uygulamanızdan yeniden oluşturmak için karşılık gelen varlık türü sınıfları, Fluent apı ve veri ek açıklamaları yapı iskelesi yapılır.
Sınırlamalar
- Bir modelle ilgili her şey, bir veritabanı şeması kullanılarak gösterilebilir. Örneğin, Devralma hiyerarşileri, sahip olunan türlerve tablo bölme hakkında bilgiler veritabanı şemasında yok. Bu nedenle, bu yapılar hiçbir şekilde tersine mühendislik olmayacaktır.
- Ayrıca, bazı sütun türleri EF Core sağlayıcısı tarafından desteklenmeyebilir. Bu sütunlar modele eklenmeyecek.
- 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. bazı veritabanlarının bu tür bir sütunu (örneğin, SQL Server) temsil etmesi için özel bir türü vardır; ancak, bu bilgilere ters mühendislik uygulayabileceğiniz diğer eşzamanlılık belirteçleri tersine mühendislik uygulanmaz.
- EF Core 6 ' dan önce, C# 8 Nullable başvuru türü özelliği , ters mühendislik içinde desteklenmiyor: EF Core her zaman oluşturulan c# kodu özelliğin devre dışı olduğunu kabul ediyor. örneğin, null yapılabilir metin sütunları,
stringstring?bir özelliğin gerekli olup olmadığını yapılandırmak için kullanılan Fluent apı veya veri ek açıklamalarıyla birlikte, türü olan bir özellik olarak yapılanmıştı. EF Core eski bir sürümünü kullanıyorsanız, yapı iskelesi kodunu düzenlemeye devam edebilir ve bunu C# null olabilme ek açıklamalarıyla değiştirebilirsiniz.
Modeli özelleştirme
EF Core tarafından oluşturulan kod kodunuz. Bunu değiştirebilirsiniz. Yalnızca aynı modele yeniden mühendislik uygulamanız durumunda yeniden oluşturulur. Yapı iskelesi kodu, veritabanına erişmek için kullanılabilecek bir modeli temsil eder, ancak yalnızca kullanılabilecek tek model değildir.
Varlık türü sınıflarını ve DbContext sınıfını gereksinimlerinize uyacak şekilde özelleştirin. Ö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. 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.
Ayrıca ek oluşturucular, Yöntemler, özellikler vb. ekleyebilirsiniz. ayrı bir dosyada başka bir kısmi sınıf kullanılıyor. Bu yaklaşım, modele geri dönmek istediğinizde bile geçerlidir.
Model güncelleştiriliyor
Veritabanında değişiklik yaptıktan sonra, EF Core modelinizi bu değişiklikleri yansıtacak şekilde güncelleştirmeniz gerekebilir. Veritabanı değişiklikleri basittir, değişiklikleri EF Core modelinizde el ile yapmak en kolay olabilir. Ö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.
Ancak, daha önemli değişiklikler, el ile yapılacak şekilde daha kolay hale getirir. 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.
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.
Uyarı
Modele yeniden veritabanından geri dönmek isterseniz, dosyalarda yaptığınız tüm değişiklikler kaybedilir.
İpucu
Visual Studio kullanıyorsanız, EF Core komut satırı araçlarının üzerine yapı veren bir grafik araç olan EF Core Power Tools topluluk uzantısı, ek iş akışı ve özelleştirme seçenekleri sunar.