C# 实体框架列映射

C# 实体框架列映射,c#,entity-framework,columnmappings,C#,Entity Framework,Columnmappings,我在从数据库函数将对象属性映射到列时遇到问题 数据库函数返回一个名为[手头上]的列。因此,我的模型属性被称为OnHand 这显然无法正确映射,并且无法正确检索该列的数据 为了解决此问题,我尝试了以下方法: 编辑模型以使用注释 [Column("On Hand")] public int OnHand { get; set; } 使用流畅的API modelBuilder.Entity<BinDetail>() .Property(e => e.OnHand)

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

数据库函数返回一个名为
[手头上]
的列。因此,我的模型属性被称为
OnHand

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

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

编辑模型以使用注释

[Column("On Hand")]
public int OnHand { get; set; }
使用流畅的API

modelBuilder.Entity<BinDetail>()
    .Property(e => e.OnHand)
    .HasColumnName("On Hand");
modelBuilder.Entity()
.Property(e=>e.OnHand)
.姓名(“现有”);
这两种方法既没有协同工作,也没有独立工作

在测试数据库上实现此功能的唯一方法是将函数的return列更改为
[OnHand]
,但是,由于其他系统使用此函数,这不是在实时数据库上使用的选项


任何人提出的任何建议都将不胜感激

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

Database.SqlQuery<BinDetail>("Query for function").ToList();
Database.SqlQuery(“函数查询”).ToList();
因此,我意识到解决这一问题的一个方法是将查询从以下内容更改为:

SELECT*FROM…..

致:

选择……[现有]作为现有……

这确实有效,而且似乎能够正确地检索数据,但是,我认为这不是一个很好的做法


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

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

解决方法是按A到Z排序字段,这是一个快速示例:

"SELECT " + GetColumnNames<Unit>("R") + " FROM Unit AS R"
“从单位中选择“+GetColumnNames(“R”)+”作为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();
}
private static Dictionary getPropertiesCache=new Dictionary();
公共静态字符串GetColumnNames(字符串前缀)
{
var columns=GetProperties(typeof(T)).OrderBy(i=>i.Name)。选择(i=>$“[{prefix}].[{i.Name}]”;
返回字符串。Join(“,”列);
}
公共静态IEnumerable GetProperties(类型)
{
if(getPropertiesCache.ContainsKey(类型))
返回getPropertiesCache[type].AsEnumerable();
变量属性=类型
.GetTypeInfo()
.申报财产;
添加(类型,properties.ToArray());
返回getPropertiesCache[type].AsEnumerable();
}

请您解释一下为什么会这样做,以及它是如何工作的,因为我正在努力理解它。我的EntityFramework参考是v4.0.30319这是一个带有EF Core 1.0 RC1的bug(),如果您不使用它,此解决方案将无法解决您的问题。我基本上是将列名A-Z排序,这样它们就可以正确地映射。我投了更高的票,因为这似乎对某些人来说是一个非常有用的解决方案,这是一个很好的答案,但不幸的是,它对我不起作用