簡體   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