簡體   English   中英

EF核心多對多隱藏軸心

[英]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

這會使程序崩潰,因為UserRolesnull ,然后.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM