programing

잘못된 작업예외: 컨텍스트의 모델에 이 유형이 포함되어 있지 않기 때문에 '역할'에 대한 DbSet을 만들 수 없습니다.

instargram 2023. 9. 19. 20:45
반응형

잘못된 작업예외: 컨텍스트의 모델에 이 유형이 포함되어 있지 않기 때문에 '역할'에 대한 DbSet을 만들 수 없습니다.

.netcore 1.1에서 다음 솔루션이 작동하지만 1.1에서 2.0으로 업그레이드한 후 다음 오류가 발생했습니다.

잘못된 작업예외: 컨텍스트의 모델에 이 유형이 포함되어 있지 않기 때문에 '역할'에 대한 DbSet을 만들 수 없습니다.

사용자가 로그인을 시도할 때 다음 문장이 실행됩니다.

var result = await _signInManager.PasswordSignInAsync(model.Email, 
                                model.Password, model.RememberMe, lockoutOnFailure: false);

뭐가 잘못됐나요?


User.cs

public partial class User : IdentityUser<Guid>
{
    public string Name { get; set; }
}

IdentityEntities.cs

public partial class UserLogin : IdentityUserLogin<Guid>
{
}
public partial class UserRole : IdentityUserRole<Guid>
{
}
public partial class UserClaim : IdentityUserClaim<Guid>
{
}
public partial class Role : IdentityRole<Guid>
{
    public Role() : base()
    { 
    }

    public Role(string roleName)
    {
        Name = roleName;
    }
}
public partial class RoleClaim : IdentityRoleClaim<Guid>
{
}
public partial class UserToken : IdentityUserToken<Guid>
{
}

서비스 구성

services.AddIdentity<User, Role> 

당신의 것을 확인합니다.AppDbContext에서 상속되지 않음DbContext대신에 그것을 물려받아야 합니다.IdentityDbContext<ApplicationUser>

이것을 추가하면 효과가 있습니다.

builder.Entity<IdentityUserRole<Guid>>().HasKey(p => new { p.UserId, p.RoleId });

가장 일반적인 이유는

이 유형이 컨텍스트의 모델에 포함되어 있지 않으므로 'THE-MODEL'에 대한 DbSet을 생성할 수 없습니다.

다음과 같습니다

  1. 모델 이름이 데이터베이스의 테이블 이름과 일치하지 않습니다.
  2. EntityFramework는 규약상 필요한 메타를 파악할 수 없으며 이를 재정의하지 않았습니다.

Role이 IdentityRoleClaim을 상속하는 경우, 이는 구성되지 않았으며 기본 규약에서는 "Id"를 키로 요구했지만 해당 속성이 없으므로 구성해야 했습니다.규칙에 따라 엔티티 프레임워크의 키 속성으로 Id를 표시하는 Role(아이디 => new{UserId,RoleId}과 같은 속성을 생성한 경우에도 작동했습니다.

이것을 교체하면 문제를 해결할 수 있습니다.

public class ApplicationDbContext : IdentityDbContext<AppUser>

이와 함께.

public class ApplicationDbContext : IdentityDbContext<AppUser, AppRole, string>

마지막 인수에서 이 문자열 유형에 주목합니다.

DbContext가 IdentityUserContext를 상속하지 않는 경우 ConfigureServices 메서드에서 AddEntityFrameworkStores를 사용하지 마십시오.다음과 같이 AddUserStore 및 AddRoleStore로 대체합니다.

public void ConfigureServices(IServiceCollection services)
{
    ...
    services
        .AddIdentity<MyUserType, MyRoleType>(...)
        .AddUserStore<UserStore<MyUserType, MyRoleType, MyDbContextType, MyKeyType, MyUserClaimType, MyUserRoleType, MyUserLoginType, MyUserTokenType, MyRoleClaimType>>()
        .AddRoleStore<RoleStore<MyRoleType, MyDbContextType, MyKeyType, MyUserRoleType, MyRoleClaimType>>();
    ...
}

AddEntityFrameworkStores 메서드 구현을 확인하면 IdentityUserContext를 상속한다고 가정하고 DbContext에서 일반 형식을 검색하여 저장소를 추가하는 것을 볼 수 있습니다.그럼에도 불구하고 청구에 대해 기본 ID* 유형을 선택하지 못할 것입니다.이 예외를 생성합니다.

다음 사항을 추가하여 수정했습니다.

public DbSet<ApplicationRole> ApplicationRoles { get; set; }

나에게DbContext.

같은 문제가 있었는데 제가 그 문제를 포함하지 않았다는 것을 알게 되었습니다.RoleStore그리고.UserStoreApplicationDbContext에서 다음 작업을 수행해야 합니다.

public class ApplicationDbContext: IdentityDbContext<User, Role, GUID, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{}

다음과 같이 저장소에 Role, UserRole을 추가해야 합니다.

  1. 다음과 같이 RoleStore에서 상속되는 클래스 생성

    public class AppRoleStore : RoleStore<Role, ApplicaitonDbContext, GUID, UserRole, RoleClaim>{}

2)다음과 같이 UserStore에 대한 클래스 만들기

public class AppUserStore : UserStore<User, Role, ApplicationDbContext, GUID, UserClaim, UserRole, UserLogin, UserToken, RoleClaim>
    {}

저도 비슷한 문제가 있었습니다. 제 경우 아이유서스토어의 구성이 좋지 않았기 때문입니다.종속성 주입을 위해 오토팩을 사용하고 있는데 이 구성을 통해 문제가 해결되었습니다.

var dbContextParameter = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(IdentityDbContext),
                                                    (pi, ctx) => ctx.Resolve<DatabaseContext>());

  builder.RegisterType<UserStore<User, Role, DatabaseContext, Guid,UserClaim,UsersInRole,UserLogin,UserToken,RoleClaim>>()
            .As<IUserStore<User>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();
        builder.RegisterType<CustomRoleStore>()
            //RegisterType<UserStore<User, Role, DatabaseContext, Guid,UserClaim,UsersInRole,UserLogin,UserToken,RoleClaim>>()
            .As<IRoleStore<Role>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();

IdentityDbContext에서 내 databaseContext 드라이브

 public class DatabaseContext : IdentityDbContext<User, Role, Guid, UserClaim
    , UsersInRole, UserLogin, RoleClaim, UserToken
    >, IDatabaseContext

그리고 제가 해야 할 일은 사용자 스토어를 만들어 제 DI에게 주고 사인인 매니저 클래스에 주입하는 것이었습니다.

모델 빌더를 사용하여 DB 컨텍스트에 모델을 추가합니다.DB Context 클래스를 아래와 같이 작성합니다.

 public partial class CDBContext : DbContext
   {

    public CDBContext (string ConnectionString) : base(new DbContextOptionsBuilder().UseSqlServer(ConnectionString).Options)
    {

    }  
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Query<MediaData>();            
    }

저의 경우 EF DbContext에 수업을 잘못 전달하였습니다.수업을 두번 받았는데, 첫번째 수업이 있었습니다."Accounting"은."Account"EF-Db "을 EF-Dbcontext 에 엔티티 가 없는 "회계" 을 보냈고 반환했습니다입니다.

Cannot create a DbSet for 'Accounting' because this type is not included in the model for the context.

당신에게 보내고 싶은 당신의 수업을 확인해 주세요.

  1. AppDbContext가 IdentityDbContext에서 상속되었는지 확인해야 합니다.AppDbContext는 IdentityDbContext에서 상속해야 합니다.

  2. 그런 다음 OnModelCreating아래와 같이 관계를 매핑해야 합니다.

    builder.Entity<ApplicationUserRole>(userRole =>
         {
             userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
    
             userRole.HasOne(ur => ur.Role)
                 .WithMany(r => r.UserRoles)
                 .HasForeignKey(ur => ur.RoleId)
                 .IsRequired();
    
             userRole.HasOne(ur => ur.User)
                 .WithMany(r => r.UserRoles)
                 .HasForeignKey(ur => ur.UserId)
                 .IsRequired();
         });
    
  3. 전체 응용프로그램 Db 컨텍스트는 다음과 같습니다.

           using Core.Entities.Identity;
           using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
           using Microsoft.EntityFrameworkCore;
    
           namespace Infrastructure.Identity
           {
               public class AppIdentityDbContext : IdentityDbContext<AppUser, ApplicationRole, 
               string, IdentityUserClaim<string>,
               ApplicationUserRole, IdentityUserLogin<string>, IdentityRoleClaim<string>, 
               IdentityUserToken<string>>
               {
                  public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options) : 
                  base(options)
             {
             }
    
             protected override void OnModelCreating(ModelBuilder builder) 
             {
                base.OnModelCreating(builder);
    
                 builder.Entity<ApplicationUserRole>(userRole =>
                 {
                     userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
    
                     userRole.HasOne(ur => ur.Role)
                         .WithMany(r => r.UserRoles)
                         .HasForeignKey(ur => ur.RoleId)
                         .IsRequired();
    
                     userRole.HasOne(ur => ur.User)
                         .WithMany(r => r.UserRoles)
                         .HasForeignKey(ur => ur.UserId)
                         .IsRequired();
                 });
    
              }
           }
        }
    

    문제가 해결되길 바랍니다.

EF Core 5.0 및 EF Core 6.0을 사용하여 작동할 수 있도록 안내해 드립니다.

https://stackoverflow.com/a/71321924/3850405

이 문제도 있었습니다.저장 프로시저를 호출하고 테이블 구조와 전혀 일치하지 않는 스칼라 값을 이름으로 반환했습니다.

result = db.Set<*Object*>()
    .FromSqlRaw($"EXECUTE [dbo].[*StoredProcedure*] {*var*}")
    .AsEnumerable()
    .First().*ScalarValueFromProcedure*;

개체 이름이 테이블 DbSet 이름과 다릅니다.처음에는 효과가 있었지만, 어떻게든 도중에 깨졌습니다.DbSet<Object>를 생성하여 수정했습니다.

제가 이런 문제가 있었습니다.이를 수정하기 위해 엔티티 구성 클래스를 변경했습니다.

public class AspNetUserClaimsConfig : IEntityTypeConfiguration<IdentityUserClaim<string>>
{
    public void Configure(EntityTypeBuilder<IdentityUserClaim<string>> builder)
    {
        builder.ToTable("AspNetUserClaims", "Identity");

        // Primary key
         builder.HasKey(uc => uc.Id);
    }
}

저는 제 상황에서 이렇게 했습니다.

public class IdentityContext : DbContext
{
    public IdentityContext(DbContextOptions<IdentityContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new ApplicationUsersConfig());

        base.OnModelCreating(modelBuilder);
    }
} 

언급URL : https://stackoverflow.com/questions/46761397/invalidoperationexception-cannot-create-a-dbset-for-role-because-this-type-is

반응형