实体框架 - 将表的列名称作为字符串数组

use*_*119 21 c# linq entity-framework entity-framework-5

如果我首先使用EF 5和数据库生成数据库的.edmx模型,如何获取实体列的列表?

using (var db = new ProjectNameContext())
{
    // string[] colNames = db.Users.
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是colNames [0] =="Id",colNames [1] =="FirstName"等.

dav*_*v_i 42

怎么样:

var names = typeof(User).GetProperties()
                        .Select(property => property.Name)
                        .ToArray();
Run Code Online (Sandbox Code Playgroud)

当然,这可以用于任何类型,而不仅仅是EF表.

  • 这不准确.可以通过特定配置将属性映射到与属性名称不同的列名,也可以通过约定映射. (23认同)

Mar*_*eio 8

var res = typeof(TableName).GetProperties()
                        .Select(property => property.Name)
                        .ToArray();
Run Code Online (Sandbox Code Playgroud)

或者

var res = dbContext.Model.FindEntityType(typeof(TableName))
                           .GetProperties().Select(x => x.Relational().ColumnName)
                           .ToList();

var index = 0;    
var propertyInfo = res[index].PropertyInfo;

var columnName = res[index].Relational().ColumnName;
var propertyName = propertyInfo.Name;
var propertyValue = propertyInfo.GetValue(sourceObject); // NEED OBJECT TO GET VALUE
Run Code Online (Sandbox Code Playgroud)

  • 后者将为您提供列的实际名称,而第一个只会为您提供属性的名称。因此,如果属性“foo”映射到列“bar”,那么后者将为您提供“bar”。所以后者是问题的实际答案,而公认的答案不是。但它需要 EF Core 2.x。 (3认同)