如何在 EF Core 中使用属性名称从实体类型配置中获取列名称

问题描述 投票:0回答:2

我有这样的EntityTypeConfiguration类。

public class DummyTypeConfiguration : IEntityTypeConfiguration<DummyType>
{
  public void Configure(EntityTypeBuilder<DummyType> builder)
  {
      builder.HasNoKey();
      builder.Property(p => p.SecretId).HasColumnName("secretID");
      ...
  }
}

我想通过使用属性 DummyType.SecretId 来检索列名称:“secretID”:

var columnName = ...(DummyType.SecretId);
c# .net entity-framework entity-framework-core
2个回答
1
投票

EF Core 6: 可以使用以下代码来完成:

var entityType = _dataContext.Model.FindEntityType(typeof(DummyType));
var property = entityType?.GetProperty(nameof(DummyType.SecretId));
var columnName = property?.GetColumnName();

_dataContext
变量表示
DbContext
类的对象实例。


0
投票

使用 TPH 存储实体类层次结构时,可能会出现某些派生实体具有相同属性名称的情况。数据库表中的列名对于两个实体来说需要不同。

例如:

基类

  • 派生类A
    • 字符串名称
  • 派生类B
    • 字符串名称

表基类

  • 栏目名称
  • 列 DerivedClassB_Name

这里提到了这种行为:https://github.com/dotnet/efcore/issues/11046

GetColumnName() 方法在这两种情况下都返回“Name”。 要获取真实的列名,必须使用参数 StoreObjectIdentifier.Table(tableName) 调用方法 GetColumnName。 这将返回 DerivedClassA 实体的“Name”和 DerivedClassB 实体的“DerivedClassB_Name”。

所以,代码是:

var entityType = _dataContext.Model.FindEntityType(typeof(DummyType));
string tableName = entityType.GetTableName();
var property = entityType?.GetProperty(nameof(DummyType.SecretId));
var columnName = property?.GetColumnName(StoreObjectIdentifier.Table(tableName));
© www.soinside.com 2019 - 2024. All rights reserved.