[英]The entity type 'ModeratedUser' requires a primary key to be defined
我在使用代碼優先數據庫遷移的AspNetCore.Identity.EntityFrameworkCore
2.1.6遇到錯誤。 錯誤是
實體類型“ ModeratedUser”要求定義主鍵。
這讓我感到困惑,因為我為使用Fluent Api的所有實體定義了主鍵。 我已經針對這個特定問題進行了研究,所有遇到的帖子都涉及到不同的問題(請注意,我遵循以下定義我的多對多關系: https : //www.learnentityframeworkcore.com/configuration /多對多關系配置 )
以下是實體和實體類型配置:
public class ModeratedUser
{
public Guid ModeratedId { get; set; }
public virtual List<ModeratorModerated> ModeratorModerated { get; set; }
}
public class ModeratorUser
{
public Guid ModeratorId { get; set; }
public virtual List<ModeratorModerated> ModeratorModerated { get; set; }
}
//explicit class to outline many to many between moderated and moderators
public class ModeratorModerated
{
public Guid ModeratorId { get; set; }
public Guid ModeratedId { get; set; }
public ModeratedUser Moderated { get; set; }
public ModeratorUser Moderator { get; set; }
}
這是實體類型配置:
public abstract class ModeratedConfiguration : EntityMappingConfiguration<ModeratedUser>
{
public override void MapToConfig(EntityTypeBuilder<ModeratedUser> builder)
{
builder.HasKey(x => x.ModeratedId);
builder.ToTable("ModeratedUsers", "Mod");
}
}
public abstract class ModeratorsConfiguration : EntityMappingConfiguration<ModeratorUser>
{
public override void MapToConfig(EntityTypeBuilder<ModeratorUser> builder)
{
builder.HasKey(x => x.ModeratorId);
builder.ToTable("ModeratorUsers", "Mod");
}
}
public abstract class ModeratorModeratedConfiguration : EntityMappingConfiguration<ModeratorModerated>
{
public override void MapToConfig(EntityTypeBuilder<ModeratorModerated> builder)
{
builder.HasKey(x => new { x.ModeratedId, x.ModeratorId });
builder.HasOne(x => x.Moderated)
.WithMany(x => x.ModeratorModerated)
.HasForeignKey(x => x.ModeratedId);
builder.HasOne(x => x.Moderator)
.WithMany(x => x.ModeratorModerated)
.HasForeignKey(x => x.ModeratorId);
builder.ToTable("ModeratorModerated", "Mod");
}
}
如您所見,我為ModeratorUser.cs和ModeratedUser.cs都設置了.HasKey,並為ModeratorModerated.cs配置類設置了CompositeKey。
這是我的Context類:
public class DbContext : IdentityDbContext<ApplicationUser>
{
public DbContext(DbContextOptions<DbContext> options) : base(options)
{
}
public DbSet<CatalogItem> CatalogItems { get; set; }
public DbSet<ModeratedUser> ModeratedUsers { get; set; }
public DbSet<ModeratorUser> ModeratorUsers { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("UDC");
builder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
base.OnModelCreating(builder);
}
}
這是我用來實例化EntityMappingConfigurations的ModelBuilderExtensions.cs類。
public interface IEntityMappingConfiguration
{
void MapToConfig(ModelBuilder b);
}
public interface IEntityMappingConfiguration<T> : IEntityMappingConfiguration where T : class
{
void MapToConfig(EntityTypeBuilder<T> builder);
}
public abstract class EntityMappingConfiguration<T> : IEntityMappingConfiguration<T> where T : class
{
public abstract void MapToConfig(EntityTypeBuilder<T> b);
public void MapToConfig(ModelBuilder b)
{
MapToConfig(b.Entity<T>());
}
}
public static class ModelBuilderExtenions
{
private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
{
return assembly.GetTypes().Where(x => !x.IsAbstract && x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));
}
public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
{
var mappingTypes = assembly.GetMappingTypes(typeof(IEntityMappingConfiguration<>));
foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityMappingConfiguration>())
{
config.MapToConfig(modelBuilder);
}
}
}
來自VS2017中PackageManagerConsole窗口的錯誤是:
System.InvalidOperationException:實體類型'ModeratedUser'需要定義一個主鍵。
如您所見,是小型應用程序,但是我無法使用EFCore超越我的第一毫米。 這在EF6.2中幾乎沒有挑戰性。 我在這里想念什么?
試試這個變化
public class ModeratedConfiguration : IEntityTypeConfiguration<ModeratedUser>
{
public void Configure(EntityTypeBuilder<ModeratedUser> builder)
{
builder.ToTable("ModeratedUsers", "Mod");
builder.HasKey(x => x.ModeratedId);
}
}
public class ModeratorsConfiguration : IEntityTypeConfiguration<ModeratorUser>
{
public void Configure(EntityTypeBuilder<ModeratorUser> builder)
{
builder.ToTable("ModeratorUsers", "Mod");
builder.HasKey(x => x.ModeratorId);
}
}
public class ModeratorModeratedConfiguration : IEntityTypeConfiguration<ModeratorModerated>
{
public void Configure(EntityTypeBuilder<ModeratorModerated> builder)
{
builder.ToTable("ModeratorModerated", "Mod");
builder.HasKey(x => new { x.ModeratedId, x.ModeratorId });
builder.HasOne(x => x.Moderated)
.WithMany(x => x.ModeratorModerated)
.HasForeignKey(x => x.ModeratedId);
builder.HasOne(x => x.Moderator)
.WithMany(x => x.ModeratorModerated)
.HasForeignKey(x => x.ModeratorId);
}
}
您的DbContext應該是
public class DbContext : IdentityDbContext<ApplicationUser>
{
public DbContext(DbContextOptions<DbContext> options) : base(options)
{
}
public DbSet<CatalogItem> CatalogItems { get; set; }
public DbSet<ModeratedUser> ModeratedUsers { get; set; }
public DbSet<ModeratorUser> ModeratorUsers { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("UDC");
builder.ApplyConfiguration<ModeratedUser>(new ModeratedUser());
builder.ApplyConfiguration<ModeratedUser>(new ModeratorsConfiguration());
builder.ApplyConfiguration<ModeratorModerated>(new ModeratorModeratedConfiguration());
base.OnModelCreating(builder);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.