2016-05-09 4 views
1

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

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

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

私はこの問題を解決するために、次のことを試みている:

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

どちらもこれらの流暢APIを使用して注釈

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

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

アプローチは一緒にまたは独立して機能しています。

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

任意の提案は、誰が大幅に自分のコードに掘り後

答えて

1

Entity Framework Core 1.0 RC 1を使用している場合は、バグがあります(これはRC2以降で修正されています)。

​​

ヘルパーメソッド:

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(); 
} 
+0

この作品、私は苦労していてどのようにしてください動作する理由を説明してもらえ

この問題を回避するには、Z、迅速なサンプルにすることによりフィールドを注文しています少しそれに従ってください。私のEntityFrameworkのリファレンスはv4.0.30319 – DaRoGa

+0

です。これはEF Core 1.0 RC1のバグ(https://github.com/aspnet/EntityFramework/issues/4940)です。使用しない場合、この回避策では問題は解決しません。 私は基本的に列名A〜Zを順序付けし、正しくマッピングするようにします。 –

+0

私はそれが誰かにとって非常に有用な解決策になるかもしれないと思われるので、upvotedしました、そして、それは良い答えですが、残念ながらそれは私のために働いていません – DaRoGa

1

を理解されるであろうた、私は機能を実行している方法が使用することであることに気づいた:

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

したがって、私は1つを実現し

SELECT * FROM.....

へ:このためのソリューションから、クエリを変更するだろう

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

これは動作し、正しくデータを取得しているようですが、非常にかわいいと思います。

したがって、誰かがこれに対してより洗練された解決策を持っている場合、または関数を呼び出す場合は、常に私のコードと標準を改善するために探しています。

関連する問題