繁体   English   中英

实体框架列映射

[英]Entity Framework Column Mapping

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

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

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

为了解决这个问题,我尝试了以下操作:

编辑模型以使用注释

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

使用Fluent API

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

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

我可以在测试数据库上使用此方法的唯一方法是将函数的返回列更改为[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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM