【问题标题】:How to solve Entity Framework validation error?如何解决实体框架验证错误?
【发布时间】:2016-10-10 12:49:37
【问题描述】:

我正在创建一个自定义表并使用 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; }
}

数据库上下文:

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>();
    }
}

绑定:

    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' 有 没有定义键。定义此 EntityType 的键。身份用户角色: EntityType:EntitySet 'IdentityUserRoles' 基于类型 没有定义键的“IdentityUserRole”。

我假设我在某处缺少绑定,但我不知道在哪里?

编辑: 我更改了 UserRoleAccess 类。我将 Id 从 string 更改为 long 并且 我在 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 });

还是一样的结果

【问题讨论】:

  • 它说您的班级Project.Models.IdentityUserRole 没有定义密钥。你能显示类定义吗?
  • 试过了,没用。
  • EntityType 'xxxx' has no key defined 错误通常是由于并非所有表都具有模型上的KeyAttribute 定义的主键。在所有表部分类的主键上设置KeyAttribute,并确保绑定工作正常。

标签: c# asp.net-mvc entity-framework ef-code-first


【解决方案1】:

真是太有趣了。

我的第二次编辑实际上是正确的。但是由于某种原因,当我首先使用代码迁移和更新数据库时它不起作用。

我删除了所有表并通过迁移再次创建它们并且它工作。

虽然通过编辑我不得不将此代码放在两个数据库上下文中:

        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 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多