簡體   English   中英

在Entity Framework Core中一起實施單一命名約定和數據注釋的正確方法

[英]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 AnnotationsSingular 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM