【问题标题】:Entity Framework Column Mapping实体框架列映射
【发布时间】:2016-05-09 09:26:52
【问题描述】:

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

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

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

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

编辑模型以使用注释

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

使用 Fluent API

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

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

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

任何人的建议将不胜感激

【问题讨论】:

    标签: c# entity-framework columnmappings


    【解决方案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();
    }
    

    【讨论】:

    • 您能否解释一下为什么这样做以及它是如何工作的,因为我正在努力遵循它。我的 EntityFramework 参考是 v4.0.30319
    • 这是 EF Core 1.0 RC1 的一个错误 (github.com/aspnet/EntityFramework/issues/4940),如果您不使用它,此解决方法将无法解决您的问题。我基本上按 A-Z 顺序排列列名,以便它们正确映射。
    • 我投了赞成票,因为它似乎对某人来说是一个非常有用的解决方案,这是一个很好的答案,但不幸的是它对我不起作用
    【解决方案2】:

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

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

    因此,我意识到解决此问题的一种方法是从以下位置更改查询:

    SELECT * FROM.....

    到:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2017-10-23
      • 2021-06-01
      • 2016-02-21
      • 2017-02-11
      • 2011-03-09
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多