[英]Correct way of implementing Singular Naming Convention and Data Annotations together in Entity Framework Core
我正在使用Entity Framework Core 2.2
並且所有數據庫表名稱都是單數,因此我在OnModelCreating
方法中overriding
復數命名約定
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
{
entityType.Relational().TableName = entityType.DisplayName();
}
}
但是,在某些情況下,例如實體名稱與表名稱不同
[Table("AzureSchemaVersionExecutionExtract", Schema = "dbo")]
public class AzureDataExtract
{
public int Id { get; set; }
public DateTime DateApplied { get; set; }
}
當我運行該項目時,它抱怨說找不到表AzureDataExtract
因此我在OnModelCreating
方法中添加了以下代碼,並且可以正常工作。 我需要知道這是一起實現Data Annotations
和Singular Naming Convention
的正確方法
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
{
entityType.Relational().TableName = entityType.DisplayName();
}
modelBuilder.Entity<AzureDataExtract>().ToTable("AzureSchemaVersionExecutionExtract","dbo");
}
可以,但是不能使用公共API。 但是您已經在使用Microsoft.EntityFrameworkCore.Metadata.Internal
命名空間中的方法,所以這應該不成問題-只需檢查升級到較新的EF Core版本並進行相應更新時是否有所更改。
在EF Core 2.2中,技巧是使用內部的Relational()
方法接受ConfigurationSource
並傳遞ConfigurationSource.Convention
。 數據批注和常規fluent API具有更高的優先級,因此這只會覆蓋使用DbSet
名稱的內部EF Core表名稱約定。
foreach (var entityType in modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())
{
entityType.AsEntityType().Builder.Relational(ConfigurationSource.Convention)
.ToTable(entityType.DisplayName());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.