[英]EF Core Many-to-Many hide pivot
我仍在學習.NET Core 2.1。 我正在使用EF Core的Web API上工作。 目前,我正在研究用戶和角色之間的多對多關系。 我想隱藏樞軸,但最終我覺得有點笨拙,所以我想看看我能做些什么來改進它。
我開始時是這樣的:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<UserRole> UserRoles { get; set; }
}
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<UserRole> UserRoles { get; set; }
}
public class UserRole
{
public int UserId { get; set; }
public int RoleId { get; set; }
}
一切正常,然后我想向用戶添加IEnumerable<Role>
以便於訪問,並獲得更漂亮的JSON輸出。 我在網上找到了一篇這樣的文章:
public class User
{
// All of the previous code
[NotMapped]
public virtual IEnumerable<Role> Roles => UserRoles.Select(x => x.Role);
}
然后,我可以獲取用戶和角色:
_context.Users.Include(x => x.UserRoles).ThenInclude(y => y.Role)
有時候,我只希望讓沒有角色的用戶:
_context.Users
這會使程序崩潰,因為UserRoles
為null
,然后.Select(x => x.Role)
將失敗。
我對User
類的修復如下:
public class User
{
public virtual IEnumerable<Role> Roles
{
get
{
if (UserRoles == null) return null;
return UserRoles.Select(x => x.Role);
}
}
}
但是對我而言,這確實是解決該問題的一個棘手且丑陋的解決方案。 我只是不知道如何簡化它。 我嘗試做類似的事情
public virtual IEnumerable<Role> Roles => UserRoles.Select(x => x?.Role);
我想要的內容與上述代碼一樣簡單,但實際上應該可以按預期工作。
嘗試這個:
public virtual IEnumerable<Role> Roles => UserRoles?.Select(x => x.Role);
我總是在空構造函數中初始化任何集合(對於EF),並始終從其他任何調用。 舉個例子:
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<UserRole> UserRoles { get; set; }
public IEnumerable<Role> Roles => UserRoles.Select(x => x.Role);
public User()
{
this.UserRoles = new List<UserRole>();
}
public User(string name)
:this()
{
}
}
每當您將包括角色集合將被填充時,否則您將始終具有空集合,因此任何操作都不會失敗。
另外,您也不要忽略[NotMapped]屬性,因為該屬性是只讀的,EF會知道
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.