实体框架列映射

时间:2016-05-09 09:26:52

标签: c# entity-framework columnmappings

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

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

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

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

编辑模型以使用注释

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

使用Fluent API

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

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

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

任何人都有任何建议将不胜感激

2 个答案:

答案 0 :(得分:1)

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

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

因此,我意识到一个解决方案是改变查询:

SELECT * FROM.....

到:

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

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

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

答案 1 :(得分: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();
}