tôi đang sử dụng lõi dotnet 1.1 trên linux và tôi đang gặp sự cố khi tôi muốn chia tách identityContext từ dbContext thông thường của mình, bất cứ khi nào tôi chạy dòng sau trong startup.cs của tôi -> configure:Loại thực thể 'IdentityUserLogin <string>' yêu cầu phải có khóa chính để được xác định
//... some other services
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>().Database.Migrate();
//running other database.migrations here + seeding data. But it is the line above that causes problems
Vì vậy dòng này ném ngoại lệ: các loại thực thể 'IdentityUserLogin' đòi hỏi một khóa chính phải được xác định
tôi chỉ đơn giản là không hiểu điều này, tại sao nó là công việc của tôi để cung cấp cho IdentityUserLogin một khóa chính ??, nó là một lớp bên thứ 3 và tôi thậm chí không chạm vào nó. Tôi có các thiết lập sau đây đơn giản:
namespace EsportshubApi.Models
{
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
public ApplicationDbContext()
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
}
Và applicationUser:
namespace EsportshubApi.Models.Entities
{
public class ApplicationUser : IdentityUser
{
public ApplicationUser() { }
public static ApplicationUserBuilder Builder()
{
return new ApplicationUserBuilder(new ApplicationUser());
}
public int AccountId { get; set; }
public Guid AccountGuid { get; set; }
public string Salt { get; set; }
public bool Verified { get; set; }
public string Checksum { get; set; }
public string Password { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
}
}
Trong khởi động của tôi tôi đang cấu hình khuôn khổ sắc theo cách sau:
configureServices:
services.AddEntityFrameworkSqlServer().AddMySQL().AddDbContext<ApplicationDbContext>(options =>
options.UseMySQL(config["ConnectionStrings:DefaultConnection"]));
Và
Cấu hình:
app.UseIdentity();
dự án của tôi là opensourced tại địa chỉ: my github repo
nếu giúp.
Tôi đã thử rất nhiều thứ. Hai hứa hẹn nhất là lấy tất cả các lớp được sử dụng trong chương trình chung này, và chuyển chúng một cách rõ ràng, cố gắng thay đổi tất cả các khóa của chúng thành ints vv. Và nó đã đưa ra cùng một lỗi chính xác chỉ với int
thay vì chuỗi. Một cách khác tôi đã cố gắng là làm bên sau OnModelCreating
để cung cấp cho IdentityUserLogin một khóa chính bằng cách ví dụ:
modelBuilder.Entity<IdentityUserLogin<int>>()
.Property(login => login.UserId)
.ForMySQLHasColumnType("PK")
.UseSqlServerIdentityColumn()
.UseMySQLAutoIncrementColumn("AI");
Như bạn có thể thấy, đây là trở lại khi tôi đã UserId như một số nguyên, nhưng tôi thậm chí không chắc chắn nếu UserId phải là primaryKey của nó. Tôi có thể gặp phải các lỗi khác thay vì lỗi này, có nghĩa là
IdentityUserLogin is part of a hierarchy, and it has no discriminator values
Nhưng nếu tôi có giá trị phân biệt thì cuối cùng chỉ quay trở lại lỗi này. Phần kỳ lạ nhất mà tôi nghĩ là tôi có cùng một ví dụ thực hiện giống như ví dụ của UnicornStore github, nó cũng sử dụng một chút khung định danh .... Vì vậy, tôi thực sự cần những người giúp đỡ của bạn. Có thể tạo lại lỗi này bằng cách tải xuống dự án, sao chép default.appsettings.json
vào appsettings.json
, đặt trong một chuỗi kết nối hợp lệ, dotnet restore
, chạy với dotnet run --environment Development
.
Tôi thậm chí đã cố gắng thay đổi việc triển khai để sử dụng cơ sở dữ liệu MSSQL thay vì MySQL, nhưng điều đó đã cho cùng một lỗi chính xác.
không phải vì bạn đang mở rộng một IdentityDbContext, mà lên hệ thống phân cấp chứa DbSets bây giờ bạn đang bỏ qua? –
Tôi không nhớ chính xác bây giờ, nhưng tôi nghĩ đó là một cái gì đó như thế. Bối cảnh đã ám chỉ họ theo một cách nào đó. – DenLilleMand