2017-03-09 97 views
2

我的類和資源庫的結構不同的性質:實體框架的核心,包括從子類

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 =>(r As PersonUserRole).Group'不是 valid。T他表達應該代表一個屬性的訪問:「T => t.MyProperty」

好像我不能投我UserRole類型實際PersonUserRole類型包括集團/ Groups屬性。我如何包含子類的屬性?

+0

如果你嘗試什麼。 ThenInclude(r =>((PersonUserRole)r).Group)? – Mangist

+0

@Mangist恐怕這將返回一個「值不能爲空。參數名稱:源」錯誤。但我似乎無法找到問題所在。 – Tumladhir

+0

如果您的對象不能轉換爲PersonUserRole,則爲空。我個人只是做這個沒有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

['參考(表達式>)'](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();