Объект является нулевым при настройке отношения один-к-одному с текущими API - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть три класса: Role, Permission и RolePermission (разрешение роли - третья таблица в отношениях многих ко многим )

public class Role : Entity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<RolePermission> RolePermissions { get; set; }
}

public class Permission : Entity
{
    public string Name { get; set; }
    public virtual ICollection<RolePermission> RolePermissions { get; set; }
}

public class RolePermission : Entity
{
    public int RoleId { get; set; }
    public int PermissionId { get; set; }
    public Permission Permission { get; set; }
    public Role Role { get; set; }
}

Затем я использовал fluentAPI, чтобы настроить отношение :

Для Role:

HasMany(role => role.RolePermissions)
            .WithRequired(rolePermission => rolePermission.Role)
            .HasForeignKey(rolePermission => rolePermission.RoleId);

Для Permission:

HasMany(permission => permission.RolePermissions)
            .WithRequired(rolePermission => rolePermission.Permission)
            .HasForeignKey(rolePermission => rolePermission.PermissionId);

Для RolePermission:

HasRequired(rolePermission => rolePermission.Permission)
            .WithMany(permission => permission.RolePermissions)
            .HasForeignKey(rolePermission => rolePermission.PermissionId);

HasRequired(rolePermission => rolePermission.Role)
            .WithMany(role => role.RolePermissions)
            .HasForeignKey(rolePermission => rolePermission.RoleId);

Проблема в том, что заполнен только объект Role.

enter image description here

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Код в этом вопросе относится к установлению отношений. Описанная проблема в этом вопросе связана с тем, что связанные данные не загружаются автоматически. Это две разные вещи, которые имеют мало общего друг с другом.
Вы пропустили где-нибудь включить? Вы получили доступ (и, следовательно, лениво загружены) к ролевым реквизитам, но не к Permission Nav? Я хотел бы видеть код, начиная с того места, где вы запускаете запрос, и до того, где вы проверяете этот объект (согласно вашему скриншоту)

Вы ответили запрошенным кодом:

var user = _userRepository
                .FirstOrDefaultAsync(us => us.Email == email); 

var userPermissions = 
           user.UserRoles
               .First()
               .Role
               .RolePermissions
               .Select(rp => rp.Permission)
               .ToList();

Если вы вставите оператор Include() в ваш запрос, вы увидите, что Permission действительно будет выбран правильно.

Я не совсем уверен, какой объект вы проверяете. На снимке экрана показано, что вы смотрите на RolePermission, но опубликованный код предлагает вам получить список Permission объектов.

Несмотря на это, вы, кажется, уже исправили это, используя Include:

Михай Александру-Ионут @Flater, да, мне нужно использовать include и проблема решена. Это решение, поэтому, пожалуйста, опубликуйте его как ответ, чтобы принять его.

0 голосов
/ 10 сентября 2018

Id Свойство отсутствует для таблиц Role и Permission. Когда вы говорите RoleId свойство в RolePermission таблице, EF ищет Id свойство в Role таблице.

Обновите таблицы ролей и разрешений следующим образом и попробуйте:

public class Role : Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public virtual ICollection<RolePermission> RolePermissions { get; set; }
}

public class Permission : Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<RolePermission> RolePermissions { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...