2017-03-09 1 views
2

私のクラスと、リポジトリの構造とは異なる性質を含める:Entity Frameworkのコアサブクラス

public class Group{ 
    //fields 
} 

public class User{ 
    public UserRole Role {get;set;} 
} 

public abstract class UserRole{ 
    //fields 
} 

public class PersonUserRole:UserRole{ 
    public Group Group {get;set;} 
} 

public class ManagerUserRole:UserRole{ 
    public IList<Group> Groups {get;set;} 
} 

私は問題が発生した例:

​​

私は、次のエラーメッセージが表示されます

メッセージ "プロパティ式 'r =>(As As PersonUserRole).Group'が有効ではありません T 「T => t.MyProperty」私はグループ/グループのプロパティが含まれるように、実際のPersonUserRoleタイプに私のUserRoleタイプをキャストすることはできませんように思え

:彼は表現プロパティへのアクセスを表している必要があります。サブクラスのプロパティを含めるにはどうすればよいですか?

+0

あなたが何をしようとした場合。次に(r =>((PersonUserRole)r).Group)をインクルードしますか? – Mangist

+0

@Mangistこれは、 "値はnullではありません。パラメータ名:ソース"エラーを返します。しかし、私は問題が何かを見つけることができません。 – Tumladhir

+0

オブジェクトがPersonUserRoleにキャストできない場合はnullです。私は個人的にLINQなしでこれを行うでしょう – Mangist

答えて

3

現在、派生したエンティティナビゲーションプロパティの読み込みはサポートされていません。あなたはイーガーロード明示的なロードクエリに関連するエンティティの組み合わせを使用することができます回避策として

はEFコアドキュメントの Loading Related Dataセクションで説明:

var user = _users.Include(u => u.Role).SingleOrDefault(u => u.UserId == id); 
var userRoleQuery = db.Entry(user).Reference(u => u.Role).Query(); 
if (user.Role is ManagerUserRole) 
    userRoleQuery.OfType<ManagerUserRole>().Include(r => r.Groups).Load(); 
else if (user.Role is PersonUserRole) 
    userRoleQuery.OfType<PersonUserRole>().Include(r => r.Group).Load(); 
return user; 
+0

解決してくれてありがとう!私はそれを試していますが、私は 'Reference'メソッドを見つけることができません。おそらく正しい方向に私を振ってもらえますか? – Tumladhir

+0

[ 'リファレンス(式<のFunc >)'](https://docs.microsoft.com/en-us/ef/core/api/microsoft.entityframeworkcore.changetracking.entityentry-1#Microsoft_EntityFrameworkCore_ChangeTracking_EntityEntry_1_Reference__1_System_Linq_Expressions_Expression_System_Func__0___0___ ) –

1

EntityFrameworkがexaclyあなたの問題と同じである未解決の問題があります:https://github.com/aspnet/EntityFramework/issues/3910

たぶん、あなたは彼らが提案するものを試すことができますが、それが動作するかどうか、私は試すことができません。

var o = context.Set<Order>() 
    .Where(o => o.Id == 1234) 
    .Single(); 

context.Set<GroupPosition>() 
    .Where(x => x.Order == o) 
    .Include(x => x.GroupType) 
    .Load(); 

context.Set<SalesPosition>() 
    .Where(x => x.Order == o) 
    .Include(x => x.Group) 
    .Load();