Entity Framework 列映射

Entity Framework Column Mapping

我在将对象 属性 映射到数据库函数的列时遇到问题。

数据库函数 return 有一个名为 [On Hand] 的列。因此我的模型 属性 被称为 OnHand.

这显然没有正确映射并且无法正确检索该列的数据。

我尝试了以下方法来解决这个问题:

编辑模型以使用注释

[Column("On Hand")]
public int OnHand { get; set; }

使用流利 API

modelBuilder.Entity<BinDetail>()
    .Property(e => e.OnHand)
    .HasColumnName("On Hand");

这些方法都没有协同工作或独立工作。

我可以让它在测试数据库上工作的唯一方法是将函数的 return 列更改为 [OnHand],但是,由于其他系统使用此函数,这是不是在实时数据库上使用的选项。

如有任何建议,我们将不胜感激

深入研究我的代码后,我意识到我执行函数的方式是使用:

Database.SqlQuery<BinDetail>("Query for function").ToList();

因此,我意识到对此的一种解决方案是更改查询:

SELECT * FROM.....

至:

SELECT ......, [On Hand] AS OnHand.....

这确实有效并且似乎可以正确检索数据,但是,我认为这不是一个很好的做法。

因此,如果有人对此或调用函数有更优雅的解决方案,请告诉我,因为我一直在寻求改进我的代码和我们的标准。

如果您使用的是 Entity Framework Core 1.0 RC 1,则有一个错误(已在 RC2 及以后修复)导致此问题。

解决方法是按 A 到 Z 对字段进行排序,快速示例:

"SELECT " + GetColumnNames<Unit>("R") + " FROM Unit AS R"

辅助方法:

private static Dictionary<Type, PropertyInfo[]> getPropertiesCache = new Dictionary<Type, PropertyInfo[]>();

public static string GetColumnNames<T>(string prefix)
{
    var columns = GetProperties(typeof(T)).OrderBy(i => i.Name).Select(i => $"[{prefix}].[{i.Name}]");

    return string.Join(", ", columns);
}

public static IEnumerable<PropertyInfo> GetProperties(Type type)
{
    if (getPropertiesCache.ContainsKey(type))
        return getPropertiesCache[type].AsEnumerable();

    var properties = type
        .GetTypeInfo()
        .DeclaredProperties;

    getPropertiesCache.Add(type, properties.ToArray());

    return getPropertiesCache[type].AsEnumerable();
}