2

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

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

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

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

编辑模型以使用注释

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

使用流畅的 API

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

这些方法都没有一起工作或独立工作。

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

任何人的任何建议将不胜感激

4

2 回答 2

1

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

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

因此,我意识到解决此问题的一种方法是更改​​查询:

SELECT * FROM.....

至:

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

这确实有效,并且似乎可以正确检索数据,但是,我认为这不是非常漂亮或好的做法。

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

于 2016-05-09T09:35:11.250 回答
1

如果您使用的是 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();
}
于 2016-05-09T09:49:19.633 回答