如何解决实体框架验证错误

本文关键字:实体 框架 验证 错误 解决 何解决 | 更新日期: 2023-09-27 18:12:24

我正在创建一个自定义表并使用Identity。我有一个上下文添加行到这个表以及。

:

public class UserRoleAccess
{
    [Key]
    public string Id { get; set; }
    public string UserRoleId { get; set; }
    [ForeignKey("Id")]
    public virtual ApplicationRole ApplicationRole { get; set; }
    public bool IsActive { get; set; }
    public string Name { get; set; }
    public int UserRoleAccessType { get; set; }
}

db上下文:

public class UserRoleAccessContext : DbContext
{
    public UserRoleAccessContext() : base("DMConnection")
    {
        Database.SetInitializer<PersonContext>(null);
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
    }
    public static UserRoleAccessContext Create()
    {
        return new UserRoleAccessContext();
    }
    public DbSet<UserRoleAccess> UserRoleAccess { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        // IMPORTANT: we are mapping the entity User to the same table as the entity ApplicationUser
        //modelBuilder.Entity<IdentityUserLogin>().ToTable("Users").HasKey(e => e.UserId);
    }
    public DbQuery<T> Query<T>() where T : class
    {
        return Set<T>();
    }
}
<<p> 绑定/strong>:
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.Person)
            .WithMany(b => b.Users);
        modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.Person)
            .WithMany(b => b.Users)
            .HasForeignKey(p => p.PersonId);
        modelBuilder.Entity<UserRoleAccess>().HasRequired(p => p.ApplicationRole)
                    .WithMany(b => b.UserRoleAccess);
        modelBuilder.Entity<UserRoleAccess>().HasRequired(p => p.ApplicationRole)
            .WithMany(b => b.UserRoleAccess)
            .HasForeignKey(p => p.UserRoleId);
    }

当我得到错误时执行以下代码:

    public static void CreateUserRoleAccess(string name, int type, string id)
    {
        var userAccessContext = new UserRoleAccessContext();
        var userRoleAccess = new UserRoleAccess();
        userRoleAccess.UserRoleId = id;
        userRoleAccess.IsActive = true;
        userRoleAccess.UserRoleAccessType = type;
        userRoleAccess.Name = name;
        userAccessContext.UserRoleAccess.Add(userRoleAccess);
    }
误差

:

在模型生成过程中检测到一个或多个验证错误:

Project.Models。IdentityUserRole:: EntityType 'IdentityUserRole' has没有定义键。定义这个EntityType的键。IdentityUserRoles:EntityType: EntitySet 'IdentityUserRoles'是基于类型的没有定义键的"IdentityUserRole"。

我想我错过了一个绑定的地方,但我不知道在哪里?

编辑:我改变了UserRoleAccess类。我将Id从字符串更改为长和我在TSQL

中尝试了这个
  INSERT INTO UserRoleAccess (UserRoleId,IsActive, Name, UserRoleAccessType) VALUES('e5b2e76a-a106-4076-b219-6987411995e7', 1, 'TEST', 1)

它工作。虽然我仍然得到相同的错误时运行它从我的应用程序

编辑2在我的绑定中添加:

 modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
 modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });

还是相同的结果

如何解决实体框架验证错误

真有趣。

我的第二个编辑实际上是正确的。但是由于某种原因,当我首先用代码迁移和更新db时,它没有工作。

我删除了所有的表,并通过迁移重新创建了它们,它工作了。

虽然在编辑时,我不得不把这段代码放在两个db上下文中:

        modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
        modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
        modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });