2

オブジェクト プロパティをデータベース関数の列にマッピングする際に問題があります。

データベース関数は、 という列を返します[On Hand]。したがって、私のモデル プロパティは と呼ばれOnHandます。

これは明らかに正しくマップされず、その列のデータを正しく取得できません。

これを解決するために、次のことを試みました。

注釈を使用するようにモデルを編集する

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

流暢な API の使用

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

これらのアプローチはどちらも、一緒にまたは単独で機能していません。

これをテストデータベースで機能させる唯一の方法は、関数の戻り列を に変更することですが[OnHand]、この関数を使用する他のシステムのため、これはライブデータベースで使用するオプションではありません.

誰かが持っている提案は大歓迎です

4

2 に答える 2

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();
}
于 2016-05-09T09:49:19.633 に答える
1

コードを掘り下げた後、関数を実行した方法は次を使用することであることに気付きました。

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

したがって、これに対する1つの解決策は、クエリを次のように変更することであることに気付きました。

SELECT * FROM.....

に:

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

これは機能し、データを正しく取得しているように見えますが、非常にきれいまたは良い習慣だとは思いません。

したがって、これまたは関数を呼び出すためのより洗練されたソリューションを誰かが持っている場合は、私に知らせてください。私は常にコードと標準の改善を目指しています。

于 2016-05-09T09:35:11.250 に答える